👀 문제
https://school.programmers.co.kr/learn/courses/30/lessons/76502
👊 도전
1. 설계
- 문제 설명대로 구현
2. 구현
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
43
44
45
46
47
48
49
50
51
import java.util.*
class Solution {
fun solution(s: String): Int {
var answer: Int = 0
val deque: Deque<Char> = LinkedList()
repeat(s.length) {
val st = Stack<Char>()
var isAvailable = true
if (it == 0) {
s.forEach { deque.offerLast(it) }
} else {
deque.addLast(deque.pollFirst())
}
run loop@{
deque.forEachIndexed { index, ch ->
when (ch) {
'[', '{', '(' -> st.push(ch)
')' -> {
if (st.isNotEmpty() && st.peek() == '(') st.pop()
else {
isAvailable = false
return@loop
}
}
'}' -> {
if (st.isNotEmpty() && st.peek() == '{') st.pop()
else {
isAvailable = false
return@loop
}
}
']' -> {
if (st.isNotEmpty() && st.peek() == '[') st.pop()
else {
isAvailable = false
return@loop
}
}
}
if (index == deque.size - 1 && isAvailable && st.isEmpty()) {
answer++
}
}
}
}
return answer
}
}
3. 결과
🤟 성공 🤟
4. 설명
- 문자열 회전은 Deque, 올바른 괄호인지 체크는 Stack을 이용한다
- 문자열 회전해서 원래 처음 문자열로 돌아오기까지 s.length번이므로 repeat(s.length)
- 처음(it == 0)은 deque에 그대로 추가하면 되고, 이후에는 deque 첫 번째 값을 뽑아서 맨 뒤에 넣는다.
- 열린 괄호는 stack에 넣고, 닫힌 괄호가 나오면 st.peek이 대응되는 열린 괄호일 경우 pop하고 계속 진행, 아닐 경우 잘못된 문자열이므로 for문을 나가고 isAvailable은 false.
- answer++의 조건은 문자열 체크가 다 끝나고(index == deque.size-1), 잘못된 문자열이 아니고(isAvailable), stack에 남은 값이 없을 경우(st.isEmpty)이다.