코딩 테스트

(Java) 프로그래머스 - 괄호 회전하기

로승리 2022. 8. 1. 21:13

예전에 풀었던 괄호 변환 문제와 비슷했지만 조금 더 복잡한 문제였다.

전체적인 문제 난이도는 쉬운 편이었던 것 같다.

제목이 괄호 회전이라 90도씩 돌리는줄 알았는데 왼쪽으로 한 칸씩 미는 문제였다.

 

문자열을 이동하는 메서드와 올바른 괄호인지 확인하는 메서드 2개로 로직을 짠뒤 한 번에 성공했다.

다만 코드가 쓸데없이 늘어나는것 같아서 풀면서도 마음이 불편했다.

그래서 괄호의 짝 세는 부분이 필요 없는 것 같아 지우고 리팩터링 했다.

실행 시간은 약간 더 빨리 지긴 했는데 거의 의미 없는 수준이다.


최초 코드

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
class Solution {
    static int cnt;
    public int solution(String s) {
        int answer = 0;
        cnt = 0;

        // 올바른 괄호 검사 후 문자열 이동
        for (int i = 0; i < s.length() - 1; i++) {
            isCorrect(s);
            s = move(s);
        }

        answer = cnt;

        return answer;
    }

    // 문자열을 이동하는 메서드
    static String move(String s) {
        Queue<Character> queue = new LinkedList<>();

        // Queue에 s 삽입
        for (int i = 0; i < s.length(); i++) {
            queue.add(s.charAt(i));
        }

        // 처음 문자 제거후 마지막에 추가
        char ch = queue.poll();
        queue.add(ch);

        // StringBuilder로 String 만들고 반환
        StringBuilder sb = new StringBuilder();
        while (!queue.isEmpty()) {
            sb.append(queue.poll());
        }

        return sb.toString();
    }

    // 올바른 괄호인지 확인하는 메서드
    static void isCorrect(String s) {
        Stack<Character> stack = new Stack<>();

        // 괄호의 짝이 맞는지 확인
        // 대괄호 cnt
        int fCnt = 0;
        // 중괄호 cnt
        int sCnt = 0;
        // 소괄호 cnt
        int tCnt = 0;

        for (int i = 0; i < s.length(); i++) {
            switch (s.charAt(i)) {
                case '[':
                    fCnt++;
                    break;
                case ']':
                    fCnt--;
                    break;
                case '(':
                    sCnt++;
                    break;
                case ')':
                    sCnt--;
                    break;
                case '{':
                    tCnt++;
                    break;
                case '}':
                    tCnt--;
                    break;
            }
        }
        // 짝이 맞는다면 Stack에 넣고 짝이 맞으면 제거
        if (fCnt == 0 && sCnt == 0 && tCnt == 0) {
            for (int i = 0; i < s.length(); i++) {
                if(s.charAt(i) == '[') {
                    stack.push(s.charAt(i));
                } else if((stack.contains('[')) && s.charAt(i) == ']') {
                    stack.pop();
                } else if(s.charAt(i) == '(') {
                    stack.push(s.charAt(i));
                } else if ((stack.contains('(')) && s.charAt(i) == ')') {
                    stack.pop();
                } else if (s.charAt(i) == '{') {
                    stack.push(s.charAt(i));
                } else if((stack.contains('{')) && s.charAt(i) == '}') {
                    stack.pop();
                }
            }
            // Stack의 size가 0이면 조건 만족
            if(stack.size() == 0) {
                cnt++;
            }
        }
    }
}

 

최종 코드

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
class Solution {
    static int cnt;
    public int solution(String s) {
        int answer = 0;
        cnt = 0;

        // 올바른 괄호 검사 후 문자열 이동
        for (int i = 0; i < s.length() - 1; i++) {
            isCorrect(s);
            s = move(s);
        }

        answer = cnt;

        return answer;
    }
    // 문자열을 이동하는 메서드
    static String move(String s) {
        Queue<Character> queue = new LinkedList<>();

        // Queue에 s 삽입
        for (int i = 0; i < s.length(); i++) {
            queue.add(s.charAt(i));
        }

        // 처음 문자 제거후 마지막에 추가
        char ch = queue.poll();
        queue.add(ch);

        // StringBuilder로 String 만들고 반환
        StringBuilder sb = new StringBuilder();
        while (!queue.isEmpty()) {
            sb.append(queue.poll());
        }

        return sb.toString();
    }

    // 올바른 괄호인지 확인하는 메서드
    static void isCorrect(String s) {
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            if (stack.isEmpty()) {
                stack.push(s.charAt(i));
            } else {
                if ((stack.contains('[')) && s.charAt(i) == ']') {
                    stack.pop();
                } else if ((stack.contains('(')) && s.charAt(i) == ')') {
                    stack.pop();
                } else if ((stack.contains('{')) && s.charAt(i) == '}') {
                    stack.pop();
                } else {
                    stack.add(s.charAt(i));
                }
            }
        }
            // Stack의 size가 0이면 조건 만족
            if (stack.size() == 0) {
                cnt++;
        }
    }
}