문제 풀이를 할 때 마다 계속 추가됩니다.

cmd + F 를 통해 문제번호 찾기를 추천드립니다.

 

22.03.15 업데이트

22.03.16 업데이트

22.03.17 업데이트

22.03.19 업데이트

22.03.20 업데이트

22.03.21 업데이트

22.03.22 업데이트

 

아래 깃허브 주소에서 모든 백준 문제풀이를 확인하실 수 있습니다.

https://github.com/SuminPark-developer/BaekJoonPS

 

GitHub - SuminPark-developer/BaekJoonPS: 백준 Swift PS

백준 Swift PS. Contribute to SuminPark-developer/BaekJoonPS development by creating an account on GitHub.

github.com

 


백준 Swift 1302번

// MARK: - 1302번
let N = Int(readLine()!)!
var books: [String: Int] = [:]

for _ in 0..<N {
    let input = readLine()!

    if books.keys.contains(input) { // 이미 팔린적 있으면
        books[input]! += 1
    }
    else { // 팔린적 없으면, 추가
        books[input] = 1
    }
}

var bestSeller: [String] = []
for book in books {
    if book.value == books.values.max()! { // 가장 많이 팔린 책이면,
        bestSeller.append(book.key)
    }
}

bestSeller.sort(by: <)
print(bestSeller.first!)

 


백준 Swift 11047번 - 그리디(Greedy)

// MARK: - 11047번
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
var (N, K) = (input[0], input[1])

var coins: [Int] = []
for _ in 0..<N {
    coins.append(Int(readLine()!)!)
}

coins.reverse()

var count: Int = 0
for coin in coins {
    count += K / coin
    K = K % coin
}

print(count)

 


백준 Swift 1449번 - 그리디(Greedy)

// MARK: - 1449번
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, L) = (input[0], input[1])
var pipe = Array(repeating: false, count: 1001) // 1부터 1000까지.(index 0은 생략)

let leak: [Int] = readLine()!.split(separator: " ").map{Int(String($0))!}

for index in leak {
    pipe[index] = true
}

var answer: Int = 0
var index: Int = 0
while index <= 1000 {
    if pipe[index] == true { // 새는 곳이면,
        index += L // 테이프의 길이 만큼 움직여 줌.
        answer += 1 // 테이프 1개 추가.
    }
    else { // 새는 곳이 아니면,
        index += 1
    }
}

print(answer)

 


백준 Swift 11724번(DFS)

// MARK: - 11724번(DFS)
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, M) = (input[0], input[1])
var adj = Array(repeating: Array(repeating: false, count: N + 1), count: N + 1)
var check = Array(repeating: false, count: N + 1) // 방문체크
var answer: Int = 0

for _ in 0..<M {
    let input = readLine()!.split(separator: " ").map{Int(String($0))!}
    let (u, v) = (input[0], input[1])
    adj[u][v] = true
    adj[v][u] = true
}

func dfs(_ index: Int) {
    for next in 1...N {
        if (index != next) && (adj[index][next] == true) && (check[next] == false) { // 자기자신X, 연결되어 있고, 방문한 적 없으면,
            check[next] = true
            dfs(next)
        }
    }
    
}

for i in 1...N {
    if check[i] == false {
        check[i] = true
        answer += 1
        dfs(i)
    }
    
}

print(answer)

백준 Swift 11724번(BFS)

// MARK: - 11724번(BFS)
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, M) = (input[0], input[1])
var adj = Array(repeating: Array(repeating: false, count: N + 1), count: N + 1)
var check = Array(repeating: false, count: N + 1) // 방문 체크
var answer: Int = 0

for _ in 0..<M {
    let input = readLine()!.split(separator: " ").map{Int(String($0))!}
    let (u, v) = (input[0], input[1])
    adj[u][v] = true
    adj[v][u] = true
}

class Dequeue<T> {
    var enQueue: [T]
    var deQueue: [T] = []
    
    var count: Int {
        return enQueue.count + deQueue.count
    }
    
    var isEmpty: Bool {
        return enQueue.isEmpty && deQueue.isEmpty
    }
    
    init(_ queue: [T]) {
        enQueue = queue
    }
    
    func pushLast(_ element: T) {
        enQueue.append(element)
    }
    
    func pushFirst(_ element: T) {
        deQueue.append(element)
    }
    
    func popLast() -> T {
        if enQueue.isEmpty {
            enQueue = deQueue.reversed()
            deQueue.removeAll()
        }
        return enQueue.popLast()!
    }
    
    func popFirst() -> T {
        if deQueue.isEmpty {
            deQueue = enQueue.reversed()
            enQueue.removeAll()
        }
        return deQueue.popLast()!
    }
}

func bfs(_ startIndex: Int) {
    var q = Dequeue([startIndex])
    
    while !q.isEmpty {
        let now = q.popFirst()
        for next in 1...N {
            if (adj[now][next] == true) && (check[next] == false) { // 연결되어 있고, 방문한 적 없으면,
                check[next] = true
                q.pushLast(next)
            }
        }
    }
    
}

for i in 1...N {
    if check[i] == false {
        check[i] = true
        answer += 1
        bfs(i)
    }
}

print(answer)

 


백준 Swift 2178번

// MARK: - 2178번
class Dequeue<T> {
    var enQueue: [T]
    var deQueue: [T] = []
    
    var count: Int {
        return enQueue.count + deQueue.count
    }
    
    var isEmpty: Bool {
        return enQueue.isEmpty && deQueue.isEmpty
    }
    
    init(_ queue: [T]) {
        enQueue = queue
    }
    
    func pushLast(_ element: T) {
        enQueue.append(element)
    }
    
    func pushFirst(_ element: T) {
        deQueue.append(element)
    }
    
    func popLast() -> T {
        if enQueue.isEmpty {
            enQueue = deQueue.reversed()
            deQueue.removeAll()
        }
        return enQueue.popLast()!
    }
    
    func popFirst() -> T {
        if deQueue.isEmpty {
            deQueue = enQueue.reversed()
            enQueue.removeAll()
        }
        return deQueue.popLast()!
    }
    
}

let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, M) = (input[0], input[1])
var adj: [[Int]] = []

for _ in 0..<N {
    let input = readLine()!.map{Int(String($0))!}
    adj.append(input)
}

let dy = [0, 1, 0, -1]
let dx = [1, 0, -1, 0]
var visited = Array(repeating: Array(repeating: false, count: M), count: N)

func isValid(_ y: Int, _ x: Int) -> Bool {
    return (0 <= y && y <= N - 1) && (0 <= x && x <= M - 1)
}

func bfs(_ startY: Int, _ startX: Int) -> Int {
    visited[startY][startX] = true // 시작위치 방문 포함.
    let q = Dequeue([(startY, startX, 1)])
    
    while !q.isEmpty {
        let (y, x, d) = q.popFirst()
        
        if y == N-1 && x == M-1 { // 끝에 도달했으면,
            return d
        }
        
        for k in 0..<4 {
            let ny = y + dy[k]
            let nx = x + dx[k]
            let nd = d + 1
            if isValid(ny, nx) && !visited[ny][nx] && adj[ny][nx] == 1 { // 정상 좌표고, 방문한 적 없고, 길이 갈 수 있으면(1이면),
                visited[ny][nx] = true
                q.pushLast((ny, nx, nd))
            }
        }
    }
    
    return 1
    
}

let answer = bfs(0, 0)
print(answer)

 


백준 Swift 7785번

// MARK: - 7785번
let N = Int(readLine()!)!
var names: Set<String> = []

for _ in 0..<N {
    let input = readLine()!.split(separator: " ").map{String($0)}
    let (name, state) = (input[0], input[1])
    
    if state == "enter" { // enter
        names.insert(name)
    }
    else if state == "leave" { // leave
        if names.contains(name) {
            names.remove(name)
        }
    }
    
}

let temp = names.sorted(by: >)

for name in temp {
    print(name)
}

 


백준 Swift 1021번

// MARK: - 1021번
class Dequeue<T: Comparable> {
    var enQueue: [T]
    var deQueue: [T] = []
    
    var count: Int {
        return enQueue.count + deQueue.count
    }
    
    var isEmpty: Bool {
        return enQueue.isEmpty && deQueue.isEmpty
    }
    
    init(_ queue: [T]) {
        enQueue = queue
    }
    
    func pushLast(_ element: T) {
        enQueue.append(element)
    }
    
    func pushFirst(_ element: T) {
        deQueue.append(element)
    }
    
    func popLast() -> T {
        if enQueue.isEmpty {
            enQueue = deQueue.reversed()
            deQueue.removeAll()
        }
        return enQueue.popLast()!
    }
    
    func popFirst() -> T {
        if deQueue.isEmpty {
            deQueue = enQueue.reversed()
            enQueue.removeAll()
        }
        return deQueue.popLast()!
    }
    
    func firstIndex(_ num: T) -> Int {
        let newQue = deQueue.reversed() + enQueue
        if let i = newQue.firstIndex(where: {$0 == num}) {
            return i
        }
        return 0
    }
}

let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, M) = (input[0], input[1])
let position = readLine()!.split(separator: " ").map{Int(String($0))!}
var myQ = Dequeue([0])
for i in 1...N {
    myQ.pushLast(i)
}
myQ.popFirst() // 0 제거

var answer: Int = 0
for pos in position {
    let index = myQ.firstIndex(pos) // myQ에서의 그 숫자의 index
    let count = myQ.count
    
    // index기준으로 전체에서 - 왼쪽으로 가는게 짧은지, 오른쪽으로 가는게 짧은지 비교해서 분기.
    
    if index <= (count / 2) { // 2번 케이스 - (절반 기준으로) 왼쪽으로 가는게 짧으면,
        for _ in 0..<index {
            myQ.pushLast(myQ.popFirst()) // 맨 앞을 빼서 맨 뒤에 붙임.
            answer += 1
        }
        myQ.popFirst() // 1번 케이스
    }
    else { // 3번 케이스 - (절반 기준으로) 오른쪽으로 가는게 짧으면,
        for _ in 0..<count-index {
            myQ.pushFirst(myQ.popLast()) // 맨 뒤를 빼서 맨 앞에 붙임.
            answer += 1
        }
        myQ.popFirst()
    }
}

print(answer)

 


백준 Swift 1158번

Dequeue을 사용하면 되려 시간초과.

그냥 배열 혹은 Arrayslice<Int>(1...N)을 사용해야 함.

// MARK: - 1158번
//class Dequeue<T> {
//    var enQueue: [T]
//    var deQueue: [T] = []
//
//    var count: Int {
//        return enQueue.count + deQueue.count
//    }
//
//    var isEmpty: Bool {
//        return enQueue.isEmpty && deQueue.isEmpty
//    }
//
//    init(_ queue: [T]) {
//        enQueue = queue
//    }
//
//    func pushLast(_ element: T) {
//        enQueue.append(element)
//    }
//
//    func pushFirst(_ element: T) {
//        deQueue.append(element)
//    }
//
//    func popLast() -> T {
//        if enQueue.isEmpty {
//            enQueue = deQueue.reversed()
//            deQueue.removeAll()
//        }
//        return enQueue.popLast()!
//    }
//
//    func popFirst() -> T {
//        if deQueue.isEmpty {
//            deQueue = enQueue.reversed()
//            enQueue.removeAll()
//        }
//        return deQueue.popLast()!
//    }
//}

let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, K) = (input[0], input[1])

var result: [Int] = []
//var myQ = Dequeue(Array(1...N)) // https://stackoverflow.com/questions/34571043/how-to-create-an-array-with-incremented-values-in-swift
//var myQ = ArraySlice<Int>(1...N)
var myQ = Array(1...N)
var index: Int = K - 1 // 빼낼 인덱스.

for _ in 0..<N {

    if index >= myQ.count {
        index %= myQ.count // modulo
    }
    
    let pop = myQ.remove(at: index)
    result.append(pop)
    
    index += K - 1 // 빼낼 인덱스 옮김.
}

print("<" + result.map{String($0)}.joined(separator: ", ") + ">")

 


백준 Swift 2346번

// MARK: - 2346번
class Dequeue<T> {
    var enQueue: [T]
    var deQueue: [T] = []
    
    var count: Int {
        return enQueue.count + deQueue.count
    }
    
    var isEmpty: Bool {
        return enQueue.isEmpty && deQueue.isEmpty
    }
    
    init(_ queue: [T]) {
        enQueue = queue
    }
    
    func pushLast(_ element: T) {
        enQueue.append(element)
    }
    
    func pushFirst(_ element: T) {
        deQueue.append(element)
    }
    
    func popLast() -> T {
        if enQueue.isEmpty {
            enQueue = deQueue.reversed()
            deQueue.removeAll()
        }
        return enQueue.popLast()!
    }
    
    func popFirst() -> T {
        if deQueue.isEmpty {
            deQueue = enQueue.reversed()
            enQueue.removeAll()
        }
        return deQueue.popLast()!
    }
    
}

let N = Int(readLine()!)!
let balloons = readLine()!.split(separator: " ").map{Int(String($0))!}
var indexBallons: [(index: Int, value: Int)] = []
for i in 0..<N {
    indexBallons.append((i+1, balloons[i]))
}
var myQ = Dequeue(indexBallons)
var answer: [Int] = []

var index: Int = 0

var pop = myQ.popFirst() // 1번 풍선 값.
answer.append(pop.index)

for _ in 1..<N {
    
    if pop.value > 0 { // 풍선이 양수면, 오른쪽으로 이동.
        for _ in 0..<pop.value-1 {
            myQ.pushLast(myQ.popFirst())
        }
        pop = myQ.popFirst()
        answer.append(pop.index)
    }
    else { // 풍선이 음수면, 왼쪽으로 이동.
        for _ in 0..<abs(pop.value)-1 {
            myQ.pushFirst(myQ.popLast())
        }
        pop = myQ.popLast()
        answer.append(pop.index)
    }
    
}

for num in answer {
    print(num, terminator: " ")
}

 


백준 Swift 1406번

// MARK: - 1406번(stack사용)
var stackL = readLine()!.map{String($0)}
var stackR: [String] = []

let M = Int(readLine()!)!

for _ in 0..<M {
    let input = readLine()!
    // .split이 시간을 잡아 먹음.
//    var (command, char) = ("", "")
//    if input.contains(" ") { // 문자 입력(P)이면,
//        let temp = input.split(separator: " ").map{String($0)}
//        (command, char) = (temp[0], temp[1])
//    }
//    else { // L, D, B 이면,
//        command = input
//    }
    
    switch input {
    case "L":
        if !stackL.isEmpty {
            stackR.append(stackL.popLast()!)
        }
    case "D":
        if !stackR.isEmpty {
            stackL.append(stackR.popLast()!)
        }
    case "B":
        if !stackL.isEmpty {
            stackL.removeLast()
        }
    default: // P일 때,
        stackL.append(String(input.last!))
    }
    
}

let answer = stackL + stackR.reversed()
print(answer.joined(separator: ""))

아래 더보기 - 시간초과 코드

더보기

백준 Swift 1406번(시간초과)

// MARK: - 1406번(시간초과)
var input = readLine()!.map{String($0)}
var answer = input
let M = Int(readLine()!)!

var index: Int = input.count

for _ in 0..<M {
    let input = readLine()!
    var (command, char) = ("", "")
    if input.contains(" ") { // 문자 입력(P)이면,
        let temp = input.split(separator: " ").map{String($0)}
        (command, char) = (temp[0], temp[1])
    }
    else { // L, D, B 이면,
        command = input
    }
    
//    print("beforeIndex: \(index)")
    switch command {
    case "P":
        answer.insert(char, at: index)
        index += 1
    case "L":
        if index != 0 { // 커서가 문장의 맨 앞이 아니면,
            index -= 1
        }
    case "D":
        if index != answer.count { // 커서가 문장의 맨 뒤가 아니면,
            index += 1
        }
    case "B":
        if index != 0 { // 커서가 문장의 맨 앞이 아니면,
            answer.remove(at: index-1)
            index -= 1
        }
    default:
        print("default는 없음.")
    }
//    print("afterIndex: \(index)")
    
}

print(answer.joined(separator: ""))

 


 


백준 Swift 1935번

// MARK: - 1935번
import Foundation
let N = Int(readLine()!)!
let input = readLine()!.map{String($0)}

var nums: [Double] = Array(repeating: 0.0, count: 26)
for i in 0..<N {
    let num = Double(readLine()!)!
    nums[i] = num
}

var stack: [Double] = []
var index: Int = 0
for i in 0..<input.count {
    
    if Int(UnicodeScalar(input[i])!.value) >= 65 && Int(UnicodeScalar(input[i])!.value) <= 97 { // 알파벳을 만났을 때,
        stack.append(nums[Int(UnicodeScalar(input[i])!.value) - 65])
    }
    else { // 기호를 만났을 때,
        let back: Double = stack.popLast()!
        let front: Double = stack.popLast()!
        
        switch input[i] {
        case "+":
            stack.append(front + back)
        case "-":
            stack.append(front - back)
        case "*":
            stack.append(front * back)
        case "/":
            stack.append(front / back)
        default:
            print("default는 없음.")
        }
    }
    
}

let answer = stack.first!
print(String(format: "%.2f", answer))

 


백준 Swift 1874번(풀이1)

// MARK: - 1874번(풀이1)
let N = Int(readLine()!)!

var stack: [Int] = []
var op: [String] = []
var num: Int = 1
for _ in 0..<N {
    let input = Int(readLine()!)!
    
    while num <= input {
        stack.append(num)
        op.append("+")
        num += 1
    }
    
    if stack.last! == input {
        stack.removeLast()
        op.append("-")
    }
    else {
        op.append("NO")
        break
    }
}

if op.contains("NO") {
    print("NO")
}
else {
    for o in op { // operator 출력.
        print(o)
    }
}

백준 Swift 1874번(풀이2)

// MARK: - 1874번(풀이2)
let N = Int(readLine()!)!
var numArray: [Int] = []
for _ in 0..<N {
    numArray.append(Int(readLine()!)!)
}

var stack: [Int] = []
var operatorArray: [String] = []
var index: Int = 0

for i in 1...N {
    stack.append(i)
    operatorArray.append("+")
    
    while !stack.isEmpty && stack.last! == numArray[index] { // stack이 비어있지 않고, 스택의 마지막이 pop을 해야하는 정수면,
        stack.removeLast()
        index += 1
        operatorArray.append("-")
    }
    
}

if !stack.isEmpty {
    print("NO")
}
else {
    for op in operatorArray {
        print(op)
    }
}

 


백준 Swift 1764번

// MARK: - 1764번
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, M) = (input[0], input[1])
var setA: Set<String> = []
var setB: Set<String> = []

for _ in 0..<N {
    setA.insert(readLine()!)
}
for _ in 0..<M {
    setB.insert(readLine()!)
}

var interSet: Set<String> = setA.intersection(setB) // setA와 setB 교집합.
let answer: [String] = Array(interSet).sorted(by: <)

print(answer.count)
for name in answer {
    print(name)
}

 


백준 Swift 10799번

// MARK: - 10799번
let input = readLine()!.map{String($0)}

var index: Int = 0
var stack: [String] = []
var answer: Int = 0

while index < input.count {
    
    if input[index] == "(" && input[index+1] == ")" { // 레이저일 때,
        answer += stack.count
        index += 2
    }
    else if input[index] == "(" { // 막대 시작일 때,
        stack.append("(")
        index += 1
    }
    else { // 막대 끝일 때,
        stack.removeLast()
        index += 1
        answer += 1 // 막대 값 하나 증가.
    }
    
    
}

print(answer)

 


백준 Swift 2304번

// MARK: - 2304번
let N = Int(readLine()!)!
var info: [(coord: Int, height: Int)] = []
var array = Array(repeating: 0, count: 1001)

for _ in 0..<N {
    let input = readLine()!.split(separator: " ").map{Int(String($0))!}
    info.append((input[0], input[1]))
    array[input[0]] = input[1] // 좌표별 값 대입.
}

info.sort(by: <)
var maxCoord: Int = 0
var maxHeight: Int = 0
for data in info {
    if data.height > maxHeight {
        maxHeight = data.height // 가장 큰 기둥 높이 저장.
        maxCoord = data.coord // 가장 큰 기둥의 위치 저장.
    }
}

var answer: Int = 0
var temp: Int = 0
for i in 0..<maxCoord+1 { // 왼쪽 -> 오른쪽(큰기둥)
    if array[i] > temp { // 더 큰 기둥을 만나면,
        temp = array[i]
    }
    answer += temp
}
temp = 0
for i in stride(from: 1000, to: maxCoord, by: -1) { // 오른쪽 -> 왼쪽(큰기둥)
    if array[i] > temp { // 더 큰 기둥을 만나면,
        temp = array[i]
    }
    answer += temp
}

print(answer)

 


백준 Swift 2841번

// MARK: - 2841번
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, P) = (input[0], input[1])
var lineStack = Array(repeating: Array(repeating: 0, count: 0), count: 7)
var answer: Int = 0

for _ in 0..<N {
    let input = readLine()!.split(separator: " ").map{Int(String($0))!}
    let (line, fret) = (input[0], input[1])
    
    if lineStack[line].isEmpty { // 그 줄의 스택이 비었으면,
        lineStack[line].append(fret)
        answer += 1
    }
    else {
        if lineStack[line].last! < fret { // 새로운 프렛이 더 크면,
            lineStack[line].append(fret)
            answer += 1
        }
        else { // 새로운 프렛이 작은게 들어오면,
            while !lineStack[line].isEmpty && lineStack[line].last! > fret { // 새로운 프렛이 더 커질 때까지,
                lineStack[line].removeLast()
                answer += 1
            }
            if lineStack[line].isEmpty || lineStack[line].last! != fret { // 스택이 비었거나, 프렛이 마지막과 다를때만 넣음.(같을땐 패스.)
                lineStack[line].append(fret) // 새로운 프렛 스택에 추가.
                answer += 1
            }
            
        }
    }
//    print("\(i)번째, 값 : \(answer)")
}


print(answer)

 


백준 Swift 3986번

// MARK: - 3986번
let N = Int(readLine()!)!
var count: Int = 0

for _ in 0..<N {
    let input = readLine()!.map{String($0)}
    var stack: [String] = []
    
    if input.count % 2 == 1 { // 홀수면, 더 볼 필요도 없이 패스.
        continue
    }
    
    for ch in input {
        if stack.isEmpty { // 스택이 비어있으면,
            stack.append(ch)
        }
        else {
            if stack.last! == ch {
                stack.removeLast()
            }
            else {
                stack.append(ch)
            }
        }
    }
    
    if stack.isEmpty {
        count += 1
    }
    
}

print(count)

 


백준 Swift 1966번

// MARK: - 1966번
let testCase = Int(readLine()!)!
for _ in 0..<testCase {
    let input = readLine()!.split(separator: " ").map{Int(String($0))!}
    let (N, M) = (input[0], input[1])
    var importance = readLine()!.split(separator: " ").map{Int(String($0))!}
    var myQ: [(index: Int, priority: Int)] = []
    for i in 0..<N {
        myQ.append((i, importance[i]))
    }
    importance.sort(by: <)

    var printArray: [Int] = []
    
    while !myQ.isEmpty {
        if myQ.first!.priority == importance.max()! { // 중요도가 제일 높은 문서이면,
            printArray.append(myQ.removeFirst().index) // 인쇄.
            importance.removeLast() // 중요도 제일 높은 숫자 삭제.
        }
        else {
            myQ.append(myQ.removeFirst())
        }
    }

    let answer = printArray.firstIndex(of: M)! + 1
    print(answer)
}

 


 

 

 

반응형