문제
주어진 문자열을 회전하며 괄호가 적절한지 검사하는 문제이다.
풀이
이 문제는 총 2가지의 로직을 시행해야 한다.
1. 문자열을 회전
2. 회전된 문자열이 올바른 괄호조합인지 검사.
먼저 문자열은 다음과 같이 회전시켰다.
for (i in s.indices) {
val tmp = s.substring(i) + s.substring(0, i)
count += check(tmp)
}
s는 받아온 문자열이다.
이 때 s.indices 즉 문자열의 길이만큼 반복한다.
반복시 s.substring(i) + s.substring(0, 1)의 문자열을 생성하는데
s.substring(i) 는 i번째부터 문자를 받아온다는 의믹도
s.substring(0, i)는 처음부터 i-1번째 까지의 문자를 가져온다는 의미이다.
즉 해당 방법을 사용하면 문자열을 회전시킬 수 있다.
회전한 문자열은 check함수로 보내진다.
fun check(s: String) : Int {
val stack = mutableListOf<Char>()
for (i in s) {
when(i) {
'[', '{', '(' -> stack.add(i)
']' -> if (stack.isNotEmpty() && stack.last() == '[') {
stack.removeLast()
} else {
return 0
}
'}' -> if (stack.isNotEmpty() && stack.last() == '{') {
stack.removeLast()
} else {
return 0
}
')' -> if (stack.isNotEmpty() && stack.last() == '(') {
stack.removeLast()
} else {
return 0
}
}
}
if (stack.isEmpty()) {
return 1
} else {
println("test")
return 0
}
}
위는 체크함수부분이다.
check함수는 여는괄호와 닫는괄호에 따라 다르게 동작한다.
먼저 스택을 선언한다. 그 후 for과 when을 사용하여 받아온 문자열의 문자를 하나씩 검사한다.
만약 받아온 문자가 여는괄호 즉 [, (, { 중 하나라면 스택에 삽입한다.
닫는괄호가 나올경우에는 조금 다르게 동작하는데 만약 올바른 괄호 문자열이라면 닫는 괄호가 나왔을 때 스택 마지막 부분에
해당 닫는 괄호와 짝인 여는괄호가 나온다.
즉 ]라면 스택에 가장 윗부분에는 [ 가 있어야한다.
따라서 해당하는 닫는괄호와 맞는 짝을 찾아 만약 맞다면 스택에서 제거하고 맞지않다면 0을 return한다.
모든 반복을 마쳤을 때 stack에 남아있는 문자가 없다면 괄호 문자열이 올바른 것이므로 1을 return한다.
마지막으로 count가 괄호문자열의 개수가 된다.
코드
import java.util.*
class Solution {
fun solution(s: String): Int {
var answer: Int = -1
var count = 0
val stack: Deque<String> = ArrayDeque()
for (i in s.indices) {
val tmp = s.substring(i) + s.substring(0, i)
count += check(tmp)
}
return count
}
fun check(s: String) : Int {
val stack = mutableListOf<Char>()
for (i in s) {
when(i) {
'[', '{', '(' -> stack.add(i)
']' -> if (stack.isNotEmpty() && stack.last() == '[') {
stack.removeLast()
} else {
return 0
}
'}' -> if (stack.isNotEmpty() && stack.last() == '{') {
stack.removeLast()
} else {
return 0
}
')' -> if (stack.isNotEmpty() && stack.last() == '(') {
stack.removeLast()
} else {
return 0
}
}
}
if (stack.isEmpty()) {
return 1
} else {
println("test")
return 0
}
}
}
'알고리즘' 카테고리의 다른 글
[프로그래머스 kotlin] 네트워크 (0) | 2024.05.13 |
---|---|
[kotlin 알고리즘] 정N각형의 삼각 분 (0) | 2024.05.11 |
[프로그래머스 kotlin] 타겟 넘버 (0) | 2024.05.02 |
[프로그래머스 kotlin] 합승 택시 요금 (0) | 2024.04.20 |
[백준 kotlin] 1753 최단경로 (1) | 2024.04.18 |