Where who wants to meet someone

백준 Swift [12789] 도키도키 간식드리미 본문

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

백준 Swift [12789] 도키도키 간식드리미

Lust3r 2023. 8. 24. 15:05
728x90

난이도

실버 III

 

문제

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

 

12789번: 도키도키 간식드리미

인하대학교 학생회에서는 중간, 기말고사 때마다 시험 공부에 지친 학우들을 위해 간식을 나눠주는 간식 드리미 행사를 실시한다. 승환이는 시험 기간이 될 때마다 간식을 받을 생각에 두근두

www.acmicpc.net

 

내 답안

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를 출력