Algorithm/프로그래머스
[프로그래머스] Lv 2. 괄호 회전하기
RIEN😚
2022. 5. 13. 15:44
728x90
반응형
코딩테스트 연습 - 괄호 회전하기
programmers.co.kr
문제
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A}도 올바른 괄호 문자열입니다.
- 만약 A, B가 올바른 괄호 문자열이라면, AB도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다.
이 s를 왼쪽으로 x 칸만큼 회전시켰을 때,
s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
풀이
먼저 회전시킨다는 말이 뭔가 애매하다 앞으로는 하나씩 왼쪽으로 민다고 이야기 하겠습니다.
어떻게 풀어야 할지 곰곰히 생각해보다.🧐
입력값이 작아서 그냥 한번씩 밀어주고 올바른 괄호 문자열인지 검사했는데...
되더라고요.ㅎㅎ
올바른 괄호인지 판단하는데는 stack 자료구조를 사용하였습니다.😆
여기서 잠깐!
테스트 케이스를 돌려보니 13번째 케이스만 실패해서 원인을 찾아보니,
- 여는 괄호가 없는데 닫는 괄호가 나온 경우
- 짝이 맞지 않는 닫는 괄호가 나온 경우
위 두 가지 경우에 대해서 올바른 괄호 문자열인지 검사는 했지만,
닫는 괄호는 제대로 있는데, 여는 괄호를 전부 닫아주지 않은 경우를 체크하지 않았더라고요.😭
해당 조건도 추가해주니, 모든 테케를 통과하였습니다.
🌹 Edge 케이스를 잘 생각하면서 구현하는 능력을 기르자!😱
코드
import java.util.Stack
class Solution {
fun solution(s: String): Int {
var answer: Int = 0
val maps = mapOf(')' to '(',']' to '[','}' to '{')
// 하나씩 미는 부분
for(i in 0 until s.length) {
val stack = Stack<Char>()
var isCorrect = true
// 올바른 괄호인지 검사
for (j in 0 until s.length) {
val z = (i+j) % s.length
when(s[z]) {
'[','(','{' -> stack.push(s[z])
else -> {
// 여는 괄호가 없는데, 닫는 괄호가 나온 경우
if (stack.isEmpty()) {
isCorrect = false
break
}
val pre = stack.pop()
// 여는 괄호와 맞지 않는 닫는 괄호가 나온 경우
if (pre != maps[s[z]]) {
isCorrect = false
break
}
}
}
}
// 모든 여는 괄호가 닫히지 않는 경우도 추가 검사!🔥
if (stack.isEmpty() && isCorrect) {
answer++
}
}
return answer
}
}
반응형