Where who wants to meet someone
백준 Swift [12789] 도키도키 간식드리미 본문
728x90
난이도
실버 III
문제
https://www.acmicpc.net/problem/12789
내 답안
var waitingLine = [Int]()
var currentOrder = 1
var isSafe = true
let forwardPeopleCount = Int(readLine()!)!
var messedLine: [Int] = readLine()!.split(separator: " ").map { Int($0)! }.reversed()
while currentOrder != forwardPeopleCount {
guard let currentPerson = messedLine.popLast() else { break }
if currentPerson == currentOrder {
currentOrder += 1
} else if waitingLine.isEmpty || waitingLine.last! > currentPerson {
waitingLine.append(currentPerson)
} else {
isSafe = false
break
}
for i in waitingLine.indices.reversed() {
if waitingLine[i] == currentOrder {
waitingLine.removeLast()
currentOrder += 1
}
}
}
isSafe ? print("Nice") : print("Sad")
- waitingLine: 간식 수령처와 현재 위치 사이의 공간
currentOrder: 간식을 수령할 대기번호
isSafe: Nice, Sad를 판별할 Bool값
forwardPeopleCount: 줄을 서있는 학생들의 수
messedLine: 순서 없이 서있는 현재의 줄 - 1) currentOrder가 forwardPeopleCount와 다르다면(아직 모든 학생이 수령하지 않았다면) while문을 돌면서 작업을 수행
2) currentPerson(현재 줄 맨 앞 사람)이 수령할 차례라면 currentOrder에 1 추가(기존 스택에서는 바인딩을 하면서 pop했기 때문에 추가 작업 x)
3) 수령할 차례가 아니면서 waitingLine이 비어있거나 waitingLine의 마지막 사람이 나중 번호라면 waitingLine에 추가
4) 2~3번 경우가 아니라면 제대로 된 순서대로 받을 수 없는 환경이기 때문에 isSafe를 false로 바꾸고 break
5) 4번을 타지 않았을 경우, 2번을 통해 순서가 다음으로 넘어갔거나 3번을 통해 waitingLine에 추가되었을텐데
waitingLine에 있는 사람들 순서대로 돌면서 현재 수령할 차례라면 removeLast 처리를 하고 currentOrder에 1추가.
waitingLine의 다음 사람이 차례라면 같은 작업을 반복하고, 아니라면 패스한다
6) isSafe의 값에 따라 Nice 혹은 Sad를 출력
'백준 알고리즘 문제 기록 > 스택, 큐, 덱' 카테고리의 다른 글
백준 Swift [11866] 요세푸스 문제 0 (0) | 2023.08.25 |
---|---|
백준 Swift [2164] 카드2 (0) | 2023.08.25 |
백준 Swift [4949] 균형잡힌 세상 (0) | 2023.08.22 |
백준 Swift [9012] 괄호 (0) | 2023.08.22 |
백준 Swift [10773] 제로 (0) | 2023.08.22 |