728x90
[문제 설명]
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
- 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
[입출력 예]
s | result |
"[](){}" | 3 |
"}]()[{" | 2 |
"[)(]" | 0 |
"}}}" | 0 |
[차근 차근 생각해보기]
- s를 이어 붙여서 회전한 모습을 만든다.
- isCorrect 함수를 만들어 온전한 괄호인지 판별한다.
- 열린 괄호일 경우 stack에 넣어준다.
- 닫힌 괄호이고 stack에 들어간 괄호와 짝이 맞을 경우 stack에 있는 괄호는 빼준다.
- 만약 닫힌 괄호가 열린 괄호보다 먼저 들어갈 경우 return false를 해준다.
- isCorrect 함수에서 true일 경우 answer에 1을 더해주고 return 해준다.
[코드]
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
String newStr = s + s;
for(int i = 0; i < s.length(); i++){
if(isCorrect(newStr.substring(i, s.length() + i))){
answer += 1;
}
}
return answer;
}
boolean isCorrect(String s){
String[] str = s.split("");
Stack<String> stack = new Stack<>();
for(int i = 0; i < str.length; i++){
if(str[i].equals("(") || str[i].equals("[") || str[i].equals("{")){
stack.push(str[i]);
}else if(stack.empty()){
return false;
}else if(str[i].equals(")") && stack.peek().equals("(")){
stack.pop();
}else if(str[i].equals("]") && stack.peek().equals("[")){
stack.pop();
}else if(str[i].equals("}") && stack.peek().equals("{")){
stack.pop();
}
}
if(stack.empty()){
return true;
}
return false;
}
}
[반성할 점]
괄호 문제는 스택으로 푸는 문제이다.
회전을 위해 문자열 s를 한번 더 더한다는 아이디어가 정말 흥미로웠다.
아이디어를 주신분께선 경험의 차이라는데 과연 경험의 차이가 맞을까 의심된다..
아직까지 생각하는 코드를 구현해내는 것이 많이 부족하다.
알고리즘 이외에도 다른 문제를 풀면서 구현력을 기르도록 노력해야겠다.
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] - 더 맵게 (1) | 2024.01.07 |
---|---|
[프로그래머스] - 기사단원의 무기 (0) | 2024.01.07 |
[프로그래머스] - 연속된 수의 합 (0) | 2023.12.13 |
[프로그래머스] - 전화번호 목록 (0) | 2023.12.13 |
[프로그래머스] - 프로세스 (0) | 2023.12.13 |