문제
1874번: 스택 수열
1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.
www.acmicpc.net
풀이
주여진 수열을 만들기 위해 스택의 push와 pop 과정을 통해 구현하는 문제이다. 먼저 예제 입력 1을 예시로 수열을 만드는 방법을 살펴보자. 4를 수열에 배치하기 위해서 스택에 1, 2, 3, 4를 넣어 {1, 2, 3, 4}인 상태를 만들고 4를 빼주면 된다. 수열은 [4]이 되고 스택은 {1, 2, 3}인 상태가 된다. 다음 3을 배치하기 위해 스택에서 3을 빼준다. 스택은 {1, 2}가 되고 수열은 [4 3]이된다. 모든 입력을 차례대로 표현하면 다음과 같다.
입력 | 스택 | 수열 |
---|---|---|
4 | 1, 2, 3 | 4 |
3 | 1, 2 | 4 3 |
6 | 1, 2, 5 | 4 3 6 |
8 | 1, 2, 5, 7 | 4 3 6 8 |
7 | 1, 2, 5 | 4 3 6 8 7 |
5 | 1, 2 | 4 3 6 8 7 5 |
2 | 1 | 4 3 6 8 7 5 2 |
1 | 4 3 6 8 7 5 2 1 |
현재 수열에 출력을 나타대는 변수 cur를 선언한다. 수열의 원소를 입력받은 후, 이 값이 cur보다 크다면 두 값의 차이만큼 스택에 push 연산을 해준다. push 연산이 끝난 후, 스택의 가장 상단에는 수열에 배치해야 할 수가 된다. 따라서 pop 연산을 수행하여 스택의 가장 위에 있는 수가 원래의 수열의 순서와 일치하는지 확인하고, 일치하지 않는 경우 불가능한 수열로 판단하여 'NO'를 출력한다.
코드
import java.util.*
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val sb = StringBuilder()
val num = br.readLine().toInt()
val stack = Stack<Int>()
var cur = 0 // 수열에 출력한 수를 나타내는 변수
var check = false
repeat(num) {
val tmp = br.readLine().toInt()
if(!check) {
if(cur<tmp) { // 스택에 출력할 수를 담을때 까지 push
for(j in cur+1 .. tmp) {
stack.push(j)
sb.append("+\n")
}
}
if(stack.pop()!=tmp) { // 수열이 불가능한 경우
sb.clear()
sb.append("NO")
check = true
} else {
sb.append("-\n")
cur = tmp
}
}
}
bw.write("$sb")
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 1717번: 집합의 표현 - Kotlin[코틀린] (0) | 2023.10.31 |
---|---|
[백준] 2636번: 치즈 - Kotlin[코틀린] (0) | 2023.10.27 |
[백준] 2164번: 카드2 - Kotlin[코틀린] (0) | 2023.10.25 |
[백준] 2161번: 카드1 - Kotlin[코틀린] (0) | 2023.10.24 |
[백준] 12015번: 가장 긴 증가하는 부분 수열 2 - Kotlin[코틀린] (0) | 2023.10.16 |