[백준] 스택 수열 (1874)(kotlin)
문제 설명
입력 및 출력
» 입력
첫 줄에 n (1 ≤ n ≤ 100,000)이 주어진다. 둘째 줄부터 n개의 줄에는 수열을 이루는 1이상 n이하의 정수가 하나씩 순서대로 주어진다. 물론 같은 정수가 두 번 나오는 일은 없다.
» 출력
입력된 수열을 만들기 위해 필요한 연산을 한 줄에 한 개씩 출력한다. push연산은 +로, pop 연산은 -로 표현하도록 한다. 불가능한 경우 NO를 출력한다.
예제 입출력(테스트케이스)
입력 | 출력 |
---|---|
8 4 3 6 8 7 5 2 1 |
+ + + + - - + + - + + - - - - - |
5 1 2 5 3 4 |
NO |
문제 힌트
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]을 얻을 수 있다.
문제 풀이1
import java.util.Stack
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
val stack = Stack<Int>()
val n = readLine().toInt()
val charArr = mutableListOf<Char>() // '+'와 '-'를 차례대로 저장할 리스
var next = readLine().toInt()
var count = 1 // 2 ~ n + 1까지의 입력만 받기 위한 플래그
for (i in 1..n) { // 1부터 n까지 탐색
stack.push(i) // i를 stack에 push
charArr.add('+') // push가 일어났으므로 '+' 추가
// 입력 받은 수열의 숫자가 stack의 마지막에 저장된 것과 동일하면 반복문 실행
while (next == stack.peek()) {
stack.pop() // stack을 pop
charArr.add('-') // pop동작이 일어났으므로 '-'
// 수열의 갯수를 초과해서 입력받지 않도록 입력 카운트가 n개를 넘지 않도록 확인
if (count < n) {
next = readLine().toInt() // 새로운 수열의 수를 입력 받음
count++ // 입력 받은 수열의 갯수 1증가
}
// stack이 비어있으면 비교할 수가 없으므로 반복문 break
if (stack.isEmpty()) break
}
}
// 작업이 모두 끝나고 stack이 비어있지 않으면 수열이 아니므로 "NO"
if (stack.isNotEmpty()) println("NO")
else println(charArr.joinToString("\n"))
}