[프로그래머스] 괄호 회전하기 (Java)
https://school.programmers.co.kr/learn/courses/30/lessons/76502
입력 : 대괄호, 중괄호, 소괄호로 이루어진 문자열 s (1 ≤ s의 길이 ≤ 1,000)
출력 : s가 올바른 괄호 문자열이 되게 하는 x의 개수 (0 ≤ x < (s의 길이))
O(n)
해시맵, 스택
구현
import java.util.*;
class Solution {
public int solution(String s) {
int count = 0;
int n = s.length();
for (int i = 0; i < n; i++) {
if (isValid(s)) {
count++;
}
// 문자열 회전
s = s.substring(1) + s.charAt(0);
}
return count;
}
private boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
HashMap<Character, Character> map = new HashMap<>();
map.put(')', '(');
map.put('}', '{');
map.put(']', '[');
for (char c : s.toCharArray()) {
if (map.containsKey(c)) {
// 닫는 괄호가 나왔을 때 스택이 비어있거나 매칭되지 않으면 false
if (stack.isEmpty() || stack.pop() != map.get(c)) {
return false;
}
} else {
// 여는 괄호는 스택에 넣기
stack.push(c);
}
}
return stack.isEmpty();
}
}