문제
풀이
스택을 활용해 올바른 괄호열인지 확인하여 값의 계산까지 구현하는 문제이다. 계산은 전체를 더한 결과값 sum과 중간 단계를 나타내는 tmp로 두 개의 변수를 사용한다.
여는 괄호인 경우 괄호에 해당하는 값을 스택에 넣어주고 tmp에 곱해준다.
닫는 괄호인 경우에 스택이 비어있거나 바로 전 괄호가 짝이 맞지 않다면 잘못된 괄호열이으로 결과값을 0으로 출력해준다. 잘못된 괄호열이 아니라면 바로 전 괄호가 짝이 맞다면 tmp를 sum에 더해주고, 스택에서 값을 제거해주며 tmp는 해당하는 값으로 나눠준다.
'(()[[]])()'을 예시로 계산해보면 다음과 같다.
- '(': sum = 0, tmp = 2
- '(': sum = 0, tmp = 4
- ')': sum = 4, tmp = 2
- '[': sum = 4, tmp = 6
- '[': sum = 4, tmp = 18
- ']': sum = 22, tmp = 6
- ']': sum = 22, tmp = 2
- ')': sum = 22, tmp = 1
- '(': sum = 22, tmp = 2
- ')': sum = 24, tmp = 1
코드
import java.util.*
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
var sum = 0
var tmp = 1
val line = br.readLine()
val stack = Stack<Int>()
for(i in line.indices) {
when(line[i]) {
'(' -> {
stack.push(2)
tmp *= 2
}
')' -> {
if(stack.size == 0 || stack.peek() != 2) {
stack.push(2)
break
} else {
if(line[i-1] == '(') {
sum += tmp
}
stack.pop()
tmp /= 2
}
}
'[' -> {
stack.push(3)
tmp *= 3
}
']' -> {
if(stack.size == 0 || stack.peek() != 3) {
stack.push(3)
break
} else {
if(line[i-1] == '[') {
sum += tmp
}
stack.pop()
tmp /= 3
}
}
}
}
bw.write(if (stack.isNotEmpty()) "0" else "$sum")
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 1339번: 단어 수학 - Kotlin[코틀린] (0) | 2023.12.11 |
---|---|
[백준] 2346번: 풍선 터트리기 - Kotlin[코틀린] (0) | 2023.12.11 |
[백준] 4485번: 녹색 옷 입은 애가 젤다지? - Kotlin[코틀린] (0) | 2023.11.30 |
[백준] 2529번: 부등호 - Kotlin[코틀린] (0) | 2023.11.29 |
[백준] 18352번: 특정 거리의 도시 찾기 - Kotlin[코틀린] (0) | 2023.11.28 |