괄호 회전하기
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/76502
접근 방식
문자열 길이-1 만큼 회전시킨다.
회전시켰을 때, 모든 문자열이 올바른 괄호로 이루어졌을 경우에만 올바른 괄호 문자열이다.
모든 문자열을 0~n-1만큼 회전시키면서 올바른지 여부를 판단한다.
stack 자료구조를 이용해 여는 괄호는 stack에 push, 닫는 괄호인데 현재 stack이 비어있거나,
stack에서 pop(or peek) 데이터가 여는 괄호가 아닌 경우 (=짝이 이루어지지 않는 경우)
올바른 문자열이 아니라고 판단한다.
결과
소스 코드
import java.util.*;
class Solution {
static Queue<Character> que = new LinkedList<>();
static Map<Character, Character> map = new HashMap<>();
public int solution(String s) {
map.put('(', ')');
map.put('[', ']');
map.put('{', '}');
int answer = 0;
for(char t:s.toCharArray()) que.offer(t);
for(int i=0; i<s.length(); i++){
answer = spin(i) ? answer+1 : answer;
}
return answer;
}
boolean spin (int num){
Queue<Character> q = new LinkedList<>(que);
Stack<Character> stack = new Stack<>();
boolean flag = true;
for(int i=0; i<num; i++){
q.offer(q.poll());
}
while(!q.isEmpty()){
char cur = q.poll(); // 처리해야 할 문자
char tmp = map.getOrDefault(cur, 'x'); // 문자가 여는 괄호인지 닫는 괄호인지
// 닫는 괄호면서, 현재 스택의 맨 뒤 값과 대치된다면 제거
if(tmp=='x'){
if (stack.isEmpty() || map.get(stack.pop())!=cur) return false;
} else stack.push(cur);
}
return stack.isEmpty();
}
}
다른 접근 방식
없음.
알게 된 점
없음.