Where who wants to meet someone
백준 Swift [2164] 카드2 본문
728x90
난이도
실버 IV
문제
https://www.acmicpc.net/problem/2164
내 답안
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 메서드를 통해 그 값을 출력
'백준 알고리즘 문제 기록 > 스택, 큐, 덱' 카테고리의 다른 글
백준 Swift [11866] 요세푸스 문제 0 (0) | 2023.08.25 |
---|---|
백준 Swift [12789] 도키도키 간식드리미 (2) | 2023.08.24 |
백준 Swift [4949] 균형잡힌 세상 (0) | 2023.08.22 |
백준 Swift [9012] 괄호 (0) | 2023.08.22 |
백준 Swift [10773] 제로 (0) | 2023.08.22 |