이번에 풀어본 문제는
프로그래머스 괄호 회전하기 입니다.
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
class Solution {
public int solution(String s) {
int answer = 0;
int length = s.length();
Queue<Character> q = new LinkedList<>();
for (int i = 0; i < length; i++) q.add(s.charAt(i));
while (length-- > 0) {
Queue<Character> tmp = new LinkedList<>(q);
Stack<Character> stk = new Stack<>();
boolean flag = true;
while (!tmp.isEmpty()) {
char next = tmp.poll();
// '(', '[', '{'
if (next == '(' || next == '[' || next == '{') stk.push(next);
else if (next == ')') {
if (!stk.isEmpty() && stk.peek() == '(') stk.pop();
else {
flag = false;
break;
}
}
else if (next == ']') {
if (!stk.isEmpty() && stk.peek() == '[') stk.pop();
else {
flag = false;
break;
}
}
else if (next == '}') {
if (!stk.isEmpty() && stk.peek() == '{') stk.pop();
else {
flag = false;
break;
}
}
}
if (flag && stk.isEmpty()) answer++;
q.add(q.poll()); // 회전
}
return answer;
}
}
괄호로 이루어진 주어진 문자열에 대해 규칙을 만족하는 괄호 문자열인지를 확인하는 문제입니다.
길이만큼 문자열의 순서를 회전하면서 가능한 경우의 수가 몇 개인지 확인하면 됩니다.
괄호의 종류가 총 3개로 이루어져있기 때문에 조건을 나누어 확인해주면 되고, 확인하는 방식은 여느 괄호 문제와 동일하게 스택을 활용해서 풀어보았습니다.
문자열 회전은 기존 문자열 순서를 큐에 담아놓고, 앞의 괄호를 맨 뒤로 보내는 행위를 길이만큼 반복하여 수행했습니다.