Where who wants to meet someone

백준 Swift [2164] 카드2 본문

백준 알고리즘 문제 기록/스택, 큐, 덱

백준 Swift [2164] 카드2

Lust3r 2023. 8. 25. 13:11
728x90

난이도

실버 IV

 

문제

https://www.acmicpc.net/problem/2164

 

2164번: 카드2

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가

www.acmicpc.net

 

내 답안

var firstQueue = [Int]()
var secondQueue = [Int]()

for i in 1...Int(readLine()!)! {
    firstQueue.append(i)
}

func pop() -> Int? {
    if secondQueue.isEmpty {
        secondQueue = firstQueue.reversed()
        firstQueue.removeAll()
    }

    return secondQueue.popLast()
}

while firstQueue.count + secondQueue.count != 1 {
    let popped = pop()

    if let lastElement = pop() {
        firstQueue.append(lastElement)
    }
}

print(pop()!)
  • 하나의 큐로는 시간초과가 발생하여 맨 밑으로 이동하는 작업을 다른 큐를 이용하여 처리하고자 했다.
  • 1) firstQueue에 입력 받은 값만큼 수를 채운다
    2) while문을 통해 전체 큐에 수가 1이 남을 때까지 다음의 작업을 반복
    3) pop 메서드 수행(기존에는 while문 안에 있었으나 하단의 lastElement에서 똑같은 작업이 필요해서 메서드로 분리)
    4) pop 메서드는 secondQueue가 비어있으면 firstQueue를 reversed()해서 우리가 원하는 순서로 만들어준다(removeLast)
    그리고 그 값을 옮겼기 때문에 firstQueue를 비워주고, secondQueue의 마지막 값을 반환한다.
    5) 4번의 과정으로 맨 위의 카드를 버렸기 때문에 아래로 보낼 카드를 담을 lastElement를 바인딩해주고 비어있는 firstQueue에 추가해준다.
    6) while문이 끝나면(카드가 1장이 남는다면) pop 메서드를 통해 그 값을 출력

언어 선택 에러로 맨 처음에 C++17로 제출..