Coding Test

[Coding Test] 프로그래머스 2단계 - 괄호 회전하기

한비Skyla 2024. 12. 10. 14:41

📚 문제

 

 

✏️ 메모

1. 큐를 사용해서 문자열 회전 시키기.

2. 맨 앞의 괄호를 맨 뒤로 넣기. 

 

[Java] 자바 Queue 클래스 사용법 & 예제 총정리

Queue란? Queue의 사전적 의미는 무엇을 기다리는 사람, 차량 등의 줄 혹은 줄을 서서 기다리는 것을 의미하는데 이처럼 줄을 지어 순서대로 처리되는 것이 큐라는 자료구조입니다. 큐는 데이터를

coding-factory.tistory.com

 

 

3. 스택을 이용해서 짝 맞추기.

(), {}, [] 를 확인하는 메서드가 필요함. ( 다음에 ) 가 있는지 { 다음에 } 가 있는지 [ 다음에 ] 가 있는지...

4. 열린 괄호가 있으면 stack 에 넣고, 닫힌 괄호가 있을 때 스택의 제일 윗 부분과 같으면 스택에서 제거함. 

5. 모든 문자열 검사 후 스택이 비었으면, 올바른 문자열이므로 answer ++;

 

 

 

🔎 문제해결

import java.util.LinkedList; 
import java.util.Queue;
import java.util.Stack;

class Solution {
    public int solution(String s) {
        int answer = 0;
        // 문자열을 char 형 배열로 바꿔서 큐에 집어 넣기 
        Queue<Character> queue = new LinkedList<>();
        for (char c : s.toCharArray()) {
            queue.offer(c);
        }
        
        for (int i = 0; i < s.length(); i ++ ) {
            // 만약 괄호가 다 닫혀 있다면 answer에 ++ 
            if (isCorrect(queue)) {
                answer ++;
            }
            // 맨 앞의 괄호를 맨 뒤로 넣기.
            queue.offer(queue.poll());
        }
        
        return answer;
    }
    
    // 그 큐를 검사함. 
    // (), {}, [] 를 확인하는 메서드가 필요함. 
    // ( 다음에 ) 가 있는지 { 다음에 } 가 있는지 [ 다음에 ] 가 있는지...
    public boolean isCorrect (Queue<Character> queue) {
        Stack<Character> stack = new Stack<>();

        for (char c : queue) {
                    // 열린 괄호이면 stack 에 넣기.
            if ( c == '(' || c == '[' || c == '{' ) {
                stack.push(c);
            } else {
                // 닫힌 괄호가 있으면 짝이 맞는지 검사. 
                // 닫힌 괄호가 있는데, 열린 괄호가 없으면 false
                if (stack.isEmpty()) {
                    return false; 
                }
                
                if ( c == ')' && stack.peek() == '(') {
                    stack.pop();
                } else if (c == '}' && stack.peek() == '{') {
                    stack.pop();
                } else if (c == ']' && stack.peek() == '[') {
                    stack.pop();
                } else 
                    return false;
            }
            
        }
        
        // 스택이 다 비면 true
        return stack.isEmpty();
    }
}