괄호 회전하기 (Level2)
link - https://programmers.co.kr/learn/courses/30/lessons/76502
1. 문제 파악하기
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
- 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
[출처] - 프로그래머스 https://programmers.co.kr/learn/courses/30/lessons/76502
- 입력 : 괄호 문자열 ex."(){}[]"
- 출력 : 올바른 괄호 문자열 수
2. 아이디어
- stack 을 활용하여 열림 괄호일때 stack에 저장
- 닫힘 괄호일때 stack pop하여 현재 닫힘괄호와 짝이 맞는지 비교한다
- 모든 괄호 문자열은 따로 생성하지 않고 시작 인덱스를 조절하여 재활용한다!
- 주의사항 : 테스트 케이스 13번만 잘동작하지 않아서 애를 먹었는데, 열림괄호만 있거나 닫힘괄호만 있는경우 예외처리에 주의한다
3. 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
import java.util.Stack
class Solution {
fun solution(s: String): Int {
var stack = Stack<Char>()
var result = 0
var startIndex = 0
for(count in 0 until s.length) {
var isOk = true
run loop@{
for(index in 0 until s.length) {
when(s[(startIndex+index)%s.length]) {
'(','[','{' -> {
stack.add(s[(startIndex+index)%s.length])
}
else -> {
if(stack.isEmpty()) {
isOk = false
return@loop
}
var front = stack.pop()
when {
(s[(startIndex+index)%s.length] == ')' && front =='(') ||
(s[(startIndex+index)%s.length] == ']' && front =='[') ||
(s[(startIndex+index)%s.length] == '}' && front =='{') -> {
}
else -> {
isOk = false
return@loop
}
}
}
}
}
}
if(isOk && stack.isEmpty()) result++
startIndex++
}
return result
}
}
|
cs |
'Programmers' 카테고리의 다른 글
[Programmers] 소수찾기 - kotlin (0) | 2021.08.18 |
---|---|
[Programmers] 가장 긴 팰린드롬 - kotlin (0) | 2021.08.11 |
[Programmers] 카펫 - kotlin (0) | 2021.07.12 |
[Programmers] 기능 개발 - kotlin (0) | 2021.07.11 |
[Programmers] 타겟 넘버 - kotlin (0) | 2021.07.10 |