문제 설명
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 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 해야 합니다.
package LV2;
import java.util.Stack;
public class H76502 {
public int solution(String s) {
int answer = 0;
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
// 문자열을 왼쪽으로 x칸 회전시킴
String rotated = s.substring(i) + s.substring(0, i);
// 스택을 비우고 새로운 문자열의 괄호들을 확인
stack.clear();
boolean isCorrect = true;
for (char c : rotated.toCharArray()) {
if (c == '(' || c == '[' || c == '{') {
stack.push(c);
} else {
if (stack.isEmpty()) {
isCorrect = false;
break;
}
char top = stack.pop();
if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {
isCorrect = false;
break;
}
}
}
// 올바른 괄호 문자열인 경우 카운트 증가
if (isCorrect && stack.isEmpty()) {
answer++;
}
}
return answer;
}
}
문자열을 왼쪽으로 x칸 회전시킨 후, 회전된 문자열이 올바른 괄호 문자열인지 확인하는 방법으로 문제를 해결한다. 문자열을 회전시키기 위해 substring 메소드를 사용한다.
각 회전된 문자열에 대해 스택을 사용하여 괄호들을 확인하고, 스택이 비어있는지 여부와 모든 문자를 확인한 후에도 스택이 비어있는지 여부를 체크하여 올바른 괄호 문자열인지 판별한다. 올바른 괄호 문자열인 경우 카운트를 증가시킨다.
마지막으로 카운트를 반환하여 결과를 도출한다.
'알고리즘 > 프로그래머스 JAVA LV.2' 카테고리의 다른 글
[1차]캐시 (0) | 2023.05.25 |
---|---|
연속 부분 수열 합의 개수 (0) | 2023.05.25 |
점프와 순간 이동 (0) | 2023.05.24 |
예상 대진표 (0) | 2023.05.24 |
멀리 뛰기 (0) | 2023.05.24 |