[Kotlin/프로그래머스] 코딩테스트 연습 > 월간 코드 챌린지 시즌2 > 괄호 회전하기

👀 문제

https://school.programmers.co.kr/learn/courses/30/lessons/76502

👊 도전

1. 설계

  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. 설명

  1. 문자열 회전은 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)이다.

👏 해결 완료!