[프로그래머스/Java] Lv.2 괄호 회전하기

이은정·2024년 10월 13일

프로그래머스/Java

목록 보기
53/74
post-thumbnail

문제

로직

회전하였을 때 올바른 괄호 문자열인지 확인하고 올바른 괄호 문자열의 개수를 Return 하는 문제입니다.
만약 문자열의 길이가 홀수라면 올바른 괄호 문자열이 존재할 수 없으므로 0을 Return합니다.

(괄호의 수-1)만큼 회전하면서 회전한 문자열이 올바른 괄호 문자열인지 아래 과정을 통해 확인합니다.
먼저, 빈 Stack을 하나 생성합니다.
문자열의 각 문자를 순서대로 꺼냅니다.
꺼낸 문자열이 "(", "[", "{" 중 하나인 경우, Stack에 문자열을 추가합니다.
꺼낸 문자열이 ")", "]", "}" 중 하나인 경우, Stack의 마지막 값과 짝이 맞다면 Stack의 마지막 값을 꺼냅니다.
Stack의 마지막 값과 짝이 다르다면 올바르지 않은 괄호 문자열이므로 바로 반복문을 종료합니다.

모든 반복문을 거친 이후에 Stack이 비어 있다면 올바른 괄호 문자열이므로 answer에 1을 더해줍니다.

코드

import java.util.*;

class Solution {
    public int solution(String s) {
        int len = s.length();
        String[] sArr = s.split("");
        
        if (isOdd(len)) {
            return 0;
        }
        
        return rotateS(sArr, len);
    }
    
    // 홀수라면 1 반환, 짝수라면 0 반환
    private boolean isOdd (int len) {
        return len % 2 != 0;
    }
    
    // (괄호의 수 -1)만큼 회전
    private int rotateS (String[] sArr, int len) {
        int num = 0;
        for (int i = 0; i < len-1; i ++) {
            if (checkString(sArr, len, i)) {
                num ++;
            }
        }
        return num;
    }
    
    // 올바른 문자열인지 확인
    private boolean checkString (String[] sArr, int len, int firstIdx) {
        Stack<String> st = new Stack<>();
        boolean isCorrect = true;
        
        for (int i = firstIdx; i < len + firstIdx; i ++) {
            String currStr = sArr[i%len];
            
            if (currStr.equals("(") || currStr.equals("[") || currStr.equals("{")) {
                st.push(currStr);
            }
            else {
                 if (st.isEmpty()) {
                     isCorrect = false;
                     break;
                 }
                
                String lastString = st.pop();
                
                if ((currStr.equals(")") && !lastString.equals("(")) || (currStr.equals("}") && !lastString.equals("{")) || (currStr.equals("[") && !lastString.equals("]"))) {
                    isCorrect = false;
                    break;
                }
            }
        }
        
        return isCorrect;
    }
}

결과

느낀 점

stack 문제는 이제 어느정도 익숙해진 것 같다.
한 함수에 기능이 많아지면 가독성이 떨어지기 때문에 최대한 한 기능만 넣으려고 해보았는데 아직까지는 많이 미숙한 것 같다. 더욱 연습이 많이 필요할 것 같다.

profile
돈 많은 백수가 꿈인 백엔드 개발자 지망생

0개의 댓글