[Programmers] 괄호 회전하기
문제 출처 : [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 |
- 올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.
입출력 예 #2
- 다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.
x | s를 왼쪽으로 x칸만큼 회전 | 올바른 괄호 문자열? |
---|---|---|
0 | "}]()[{" | X |
1 | "]()[{}" | X |
2 | "()[{}]" | O |
3 | ")[{}](" | X |
4 | "[{}]()" | O |
5 | "{}]()[" | X |
- 올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.
입출력 예 #3
- s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.
입출력 예 #4
- s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.
💻코드
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;
}
}
💡후기
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
을 이용해서 문제를 해결한다는 틀에서 크게 벗어나지는 않아서, 해결 방법에 접근하는 속도도 빨랐고 딱히 예외도 존재하지 않는 문제라 금방 풀었다!
Author And Source
이 문제에 관하여([Programmers] 괄호 회전하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jaeung5169/Programmers-괄호-회전하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)