문제 출처 : [Programmers] 괄호 회전하기, https://programmers.co.kr/learn/courses/30/lessons/76502
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
- 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
제한 사항
- s의 길이는 1 이상 1,000 이하입니다.
s | result |
---|---|
"{}" | 3 |
"}]()[{" | 2 |
"[)(]" | 0 |
"}}}" | 0 |
입출력 예 #1
x | s를 왼쪽으로 x칸만큼 회전 | 올바른 괄호 문자열? |
---|---|---|
0 | "{}" | O |
1 | "](){}[" | X |
2 | "(){}[]" | O |
3 | "){}[](" | X |
4 | "{}" | O |
5 | "}{" | X |
입출력 예 #2
x | s를 왼쪽으로 x칸만큼 회전 | 올바른 괄호 문자열? |
---|---|---|
0 | "}]()[{" | X |
1 | "]()[{}" | X |
2 | "()[{}]" | O |
3 | ")[{}](" | X |
4 | "[{}]()" | O |
5 | "{}]()[" | X |
입출력 예 #3
입출력 예 #4
import java.util.Stack;
class Solution {
public int solution(String s) {
int answer = 0;
StringBuilder sb = new StringBuilder(s);
// 문자열이 올바른 괄호 문자열일 경우 answer 증가.
for(int i = 0; i < s.length(); i++){
if(isCorrect(sb.toString())){
answer++;
}
// 가장 앞의 괄호를 빼서 문자열의 뒤에 삽입한다.
sb.append(sb.charAt(0));
sb.deleteCharAt(0);
}
return answer;
}
// 전달 인자로 받은 문자열이 올바른 문자열이면 true, 아니라면 false를 반환하는 함수
static boolean isCorrect(String str){
Stack<Character> stack = new Stack<>();
char first = str.charAt(0);
// 가장 앞의 괄호가 닫힌 괄호면 더 이상 검사하지 않고 즉시 false를 반환
if(first == ')' || first == '}' || first == ']'){
return false;
}
stack.push(first);
// 열린 괄호 다음 닫힌 괄호가 있다면 stack에서 pop
for(int i = 1; i < str.length(); i++){
char c = str.charAt(i);
if(stack.isEmpty()){
stack.push(c);
continue;
}
char peek = stack.peek();
if(peek == '(' && c == ')'){
stack.pop();
}else if(peek == '{' && c == '}'){
stack.pop();
}else if(peek == '[' && c == ']'){
stack.pop();
}else{
stack.push(c);
}
}
// 스택이 비어있다면 올바른 괄호 문자열이므로 true를 반환
if(stack.isEmpty()){
return true;
}
return false;
}
}
돌아온 괄호 문제!!😁
하지만 이번엔 소괄호만 있는 게 아니라, 중괄호와 대괄호도 있기 때문에 조건문이 조금 길어졌다..😔
그래도 여전히 stack
을 이용해서 문제를 해결한다는 틀에서 크게 벗어나지는 않아서, 해결 방법에 접근하는 속도도 빨랐고 딱히 예외도 존재하지 않는 문제라 금방 풀었다!