https://school.programmers.co.kr/learn/courses/30/lessons/76502
크게 두 흐름으로 나누었다.
(1) 왼쪽 문자열 오른쪽 끝으로 옮기고, 맨 앞 문자열 삭제하기(for문)
(2) 옮긴 문자열 짝이 잘 맞는지 검사하기(getRight)
(2)번 로직은 Stack을 사용해서 현재 주어진 문자열 짝이 잘 맞는지 검증하였다.
맨 처음 스택이 비어있는 경우 ), }, ] 이러한 문자가 들어오게 되면, 바로 false -> 짝짓기 불가능
그렇지 않은 경우는 스택에 값 추가를 해준다.
), }, ]가 들어오는 경우는 무조건 Stack에 추가해주었다.
(, {, [ 가 들어오는 경우는 Stack.peek()를 사용해서 들어온 스택과 같은 모양인지 확인하고, 일치하는 경우 Stack에 쌓여있던 값을 Stack.pop()을 통해 제거해준다. 그렇지 않은 경우 stack에 add 해준다.
최종적으로 stack의 크기가 0이여야만 짝이 맞는 조건을 만족하기 때문에,
answer = true를 해주었다. stack에 값이 존재하면 짝이 맞지 않는 것이므로 기본값인 false를 return해준다.
기본적으로 짝짓기 문제는 Stack을 많이 활용한다.
Stack이 비었을때, Stack이 비어있지 않을때로 나뉘고
들어오는 모양이 어떤거인지에 따라 또 나눠준다.
public int solution(String s){
int answer = 0;
// 맨 처음 돌릴때
if(getRight(s)){
answer += 1;
}
for (int i = 1; i < s.length(); i++) { // (1)
StringBuffer sb = new StringBuffer(s);
sb.append(sb.charAt(0));
sb.delete(0,1);
s = sb.toString();
if(getRight(s)){
answer++;
}
}
return answer;
}
public boolean getRight(String s){ // (2)
boolean answer = false;
Stack stack = new Stack();
for (int i = 0; i < s.length(); i++) {
char item = s.charAt(i);
if(stack.size() == 0){
if(item == ')' || item == '}' || item == ']'){
return answer;
}else{
stack.add(item);
}
}else{
if(item == '(' || item == '{' || item == '['){ // 값 넣기
stack.add(item);
}else{
if(item == ')'){ // 값 빼기
if(stack.peek().equals('(')){
stack.pop();
}else{
stack.add(item);
}
}else if(item == '}'){
if(stack.peek().equals('{')){
stack.pop();
}else{
stack.add(item);
}
}else{
if(stack.peek().equals('[')){
stack.pop();
}else{
stack.add(item);
}
}
}
}
}
if(stack.size()==0){
answer = true;
}
return answer;
}