

나의 풀이
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
ArrayList<Character> list = new ArrayList<>();
for (char c : s.toCharArray()) { // 1
list.add(c);
}
for (int i = 0; i < list.size(); i++) { // 2
char temp = list.get(list.size() - 1);
list.add(0, temp);
list.remove(list.size() - 1);
Stack<Character> stack = new Stack<>();
for (char c : list) { // 3
if (stack.isEmpty()) stack.push(c);
else if (stack.peek() == '(') {
if (c == ')') stack.pop();
else stack.push(c);
} else if (stack.peek() == '[') {
if (c == ']') stack.pop();
else stack.push(c);
} else if (stack.peek() == '{') {
if (c == '}') stack.pop();
else stack.push(c);
}
}
if (stack.isEmpty()) answer++; // 4
}
return answer;
}
}
과정
- 주어진 s를 Character형태의 ArrayList에 넣는다
- list를 순회하며 마지막 요소를 첫번째에 넣고, 마지막 요소를 제거한 뒤 stack을 선언(나머지 요소는 첫번째에 넣는 순간 뒤로 한칸씩 밀린다)
- stack에 list의 요소를 넣으면서 괄호가 완성되면 삭제시킨다
- 반복문이 끝난 뒤 stack의 크기가 0이면 answer을 증가
다른 사람 풀이
import java.util.Stack;
class Solution {
private final Stack<Character> stack = new Stack<>();
public int solution(String s) {
int answer = 0;
StringBuilder stringBuilder = new StringBuilder(s);
for (int i = 0; i < s.length(); i++) {
stringBuilder.append(stringBuilder.charAt(0));
stringBuilder.deleteCharAt(0);
if (correctParenthesis(stringBuilder.toString().toCharArray()))
answer++;
}
return answer;
}
private boolean correctParenthesis(char[] s) {
for (char c : s) {
if (!(check(c, '(', ')') && check(c, '[', ']') && check(c, '{', '}')))
return false;
}
return stack.isEmpty();
}
private boolean check(char c, char a, char b) {
if (c == a)
stack.push(a);
else if (c == b)
if (!stack.isEmpty() && stack.peek() == a) stack.pop(); else return false;
return true;
}
}