IT Study/백준 알고리즘
[백준 알고리즘/Kotlin] 1847번 스택 수열 (feat. Stack, 스택 관련 메서드)
three kim
2024. 1. 4. 14:36
728x90
저는 처음에 이 문제를 접했을 때에는 풀이 방법을 생각하지 못했습니다.
그러나 아래와 같이 로직을 정리하고, 코드를 작성해보도록 하겠습니다.
1. 만들어야 하는 수열을 순서대로 읽으면서 해당 숫자가 스택의 top에 있지 않다면,
그 숫자가 나올 때까지 스택에 숫자를 push합니다.
이 때, push하는 숫자는 1부터 n까지 순서대로 push하고, 각 push 연산마다 + 를 출력합니다.
2. 만약 스택의 top에 있는 숫자가 현재 수열에서 읽은 숫자와 같다면,
스택에서 그 숫자를 pop하고 - 를 출력합니다.
3. 만약 스택의 top에 있는 숫자가 현재 수열에서 읽은 숫자보다 크다면,
주어진 수열을 만들 수 없는 경우이므로 NO를 출력하고 프로그램을 종료합니다.
스택의 top에 있는 수가 현재 수열에서 읽은 수보다 클 경우 NO를 출력하는 이유에 대해
아래의 예시를 보며 자세히 살펴보죠. (예제 입력 2를 예시로 들어보도록 하겠습니다.)
5
1
2
5
3
4
n = 5
1일 경우 stack = [1] → 스택의 top이 1이므로 pop() → stack = []
2일 경우 stack = [2] → 스택의 top이 2이므로 pop() → stack = []
5일 경우 stack = [3, 4, 5] → 스택의 top이 5이므로 pop() → stack = [3, 4]
3일 경우 stack = [3, 4] → 스택의 top이 4이므로 3 != 4 → 주어진 수열을 만들 수 없다.
∴ NO 출력
이를 코드로 풀어보도록 하겠습니다.
최종 코드
import java.lang.StringBuilder
import java.util.Stack
fun main() = System.`in`.bufferedReader().use { br ->
val n = br.readLine().toInt()
val stack = Stack<Int>()
val result = StringBuilder()
var current = 1 // 스택에 push 할 숫자
repeat(n) {
val input = br.readLine().toInt()
while (current <= input) {
stack.push(current++)
result.append("+\n")
}
if (stack.isNotEmpty() && stack.peek() == input) {
stack.pop()
result.append("-\n")
} else {
println("NO")
return
}
}
println(result)
}
Stack의 메서드
순번 | 메서드 | 설명 |
1 | push(e) | 스택의 맨 위에 요소 추가 (스택의 새로운 top) |
2 | pop() | 스택의 맨 위에 요소 제거 및 반환 (없을 시 EmptyStackException) |
3 | peek() | 스택의 맨 위에 요소 반환 (제거X, 없을 시 EmptyStackException) |
4 | empty() | 비었는지 확인 (비어있으면 true, 아니면 false) |
5 | search(o) | 스택의 top부터 아래로 찾아가며, top으로 부터 거리 반환 (없을 시 -1) |
6 | size() | 스택의 요소 수 반환 |
7 | capacity() | 스택의 현재 용량 반환 |
8 | contains(o) | 포함 여부 확인 (포함 시 true, 아니면 false) |
9 | elementAt(i) | 특정 위치에 있는 요소 반환 |
10 | clear() | 모든 요소 제거 |