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

풀이
대기열의 왼쪽에 있는 공간을 스택으로 생각하여 풀이하면 된다. 스택은 선입후출 구조이므로 왼쪽 공간에 먼저 들어간 번호는 나중에 나온다.
현재 도시락을 받을 번호를 나타내는 변수 cur을 1로 초기화하고 선언한다. 입력받은 대기열을 앞에서부터 순회하면서 cur과 같은 번호를 만나면 도시락을 받은 것으로 처리하고, cur을 1 증가시켜서 다음으로 받을 사람을 나타낸다. 만약 cur과 다른 번호를 만난 경우에는 스택에 추가한다. 이 때, 현재 스택에서 가장 앞에 있는 번호가 cur인 경우에는 스택을 비워주면 된다.
대기열이 끝나면 현재 스택에 남아있는 사람들을 처리한다. 만약 cur과 다른 번호를 만난 경우에는 도시락을 나눠줄수 없기 때문에 종료한다.
스택에 아무것도 남아있지않다면 모든 사람이 도시락을 받을 수 있는 것이기 때문에 "Nice"를 출력하고 아니라면 "Sad"를 출력한다.
코드
import java.util.* fun main() { val br = System.`in`.bufferedReader() val bw = System.out.bufferedWriter() val num = br.readLine().toInt() val stack = Stack<Int>() var cur = 1 br.readLine().split(' ').map { it.toInt() }.forEach { if(it == cur) cur++ else { while (stack.isNotEmpty()) { if(stack.peek() == cur) { stack.pop() cur++ } else break } stack.push(it) } } while (stack.isNotEmpty()) { if(stack.pop() == cur) cur++ else break } bw.write(if(stack.isEmpty()) "Nice" else "Sad") bw.flush() bw.close() br.close() }
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 24511번: queuestack - Kotlin[코틀린] (0) | 2024.01.18 |
---|---|
[백준] 1644번: 소수의 연속합 - Kotlin[코틀린] (0) | 2024.01.17 |
[백준] 1806번: 부분합 - Kotlin[코틀린] (0) | 2024.01.15 |
[백준] 2047번: 두 용액 - Kotlin[코틀린] (1) | 2024.01.14 |
[백준] 2018번: 수들의 합 5 - Kotlin[코틀린] (0) | 2024.01.13 |