코딩테스트

[ 프로그래머스 ] 괄호 회전하기

Adose 2025. 2. 13. 10:17

📘요구 사항 정리

  • (), [], {} 는 모두 올바른 괄호 문자열입니다.
    • 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다.
      • 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
    • 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다.
      • 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.

 

📌 제약 조건

  • s의 길이는 1 이상 1,000 이하입니다.

 

📌 구현코드

package pra.lv2.괄호회전하기;

import java.util.Stack;

public class answer_1 {
    public static void main(String[] args) {
        int result = solution("[](){}");
        System.out.println(result);
}

    //(), [], {} 는 올바른
    public static int solution(String s) {

        boolean valid = true;
        int count =0;

        for(int i=0;i<s.length();i++){
            result = true;
            Stack<Character> chatList = new Stack<>();
            for(int j=0;j<s.length();j++){
                //j가 어디서부터 시작하는지 정해주고
                //i가 회전 수를 나타내는 것이기 때문에
                //i+j %s.length를 한다면 회전 후 해당되는 위치의 값을 구할 수 있다.
                char data = s.charAt((i+j)%s.length());

                if(data==('(')||data==('[')||data==('{')){
                    chatList.push(data);
                }else{
                    if(chatList.empty()){
                        valid = false;
                        break;
                    }
                    char peekData = chatList.peek();
                    if(peekData==('(')&&data==(')') ||
                    peekData==('[')&&data==(']')||
                    peekData==('{')&&data==('}')){
                        chatList.pop();
                    }
                }
            }

            if (chatList.empty()&&valid ==true){
                count++;
            }

        }

        return count;
    }
}

 

📌 구현코드 해설

  • 스택을 공부하고 다시보니 훨씬 수월하게 풀었다.
  • for문 첫번째 i는 회전수 이다.
  • for문 두번째 j는 문자열 개수만큼 for문을 돌린다.
  • char data = s.charAt((i+j)%s.length());
    • 회전수 + 문자열 개수를 하고 s.length를 하게 되면 회전 된 값 만큼 추가 돼서
    • 회전된 값 부터 for문이 시작하게 된다.
  • 만약 여는 괄호를 만나면 Stack에 값을 넣어주고
  • 닫는 괄호를 만날때 Stack이 비어있다면
    1. valid를 false로 만들고
    2. 즉시 for문을 종료한다.
  • 닫는 괄호를 만나고 Stack이 비어있지 않다면
    • Stack 의 peek을 사용하여 마지막으로 들어가져 있는 값을 들고 온다.
    • peek한 값과, 현재 닫는괄호를 비교해서 알맞다면 pop을 해준다
  • 2번째 for문을 종료한 후 valid가 true이고, stack도 비어 있다면 count++를 해준다.