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

조예빈·2024년 7월 19일
0

Coding Test

목록 보기
63/146
post-custom-banner

https://school.programmers.co.kr/learn/courses/30/lessons/76502

이 문제는 5점짜리 문제 같지 않았다 ㅠㅠ 시간이 매우 오래 걸렸기 때문이다.

우선, 문자열을 순회하는 조건문을 만들기 위해 시간을 많이 썼는데, 어차피 s의 길이만큼 반복하므로 문자열을 두 번 붙여준 후 일정 길이만큼만 탐색해도 되는 문제였다.

그리고 원래는 스택을 Integer형으로 선언해 1을 넣어줬는데, 이 문제에서는 괄호의 종류가 다양하다. 그래서 스택에 그냥 괄호를 넣고, 상위 요소와 현재 괄호를 비교해 일치하지 않으면 break를 걸어주면 된다.
어차피 가장 늦게 열린 괄호가 가장 먼저 닫혀야 하기 때문이다.

import java.util.*;

class Solution {
    public int solution(String s) {
        //괄호를 스택에 저장 -> 열리는 괄호면 스택에 1 넣기, 닫히는 괄호면 1 빼기
        //스택이 비어 있다면 올바른 괄호, 안비어있다면 올바르지 않은 괄호
        //이중 for문 활용. for문을 이용해서 index 수정
        int length = s.length();
        int cnt = 0;
        
        for(int i=0; i<length; i++){ //몇 번째 문자열이 맨 처음에 올 것인지를 설정해 주는 반복문
            Stack<Character> stack = new Stack<>();
            
            StringBuffer sb = new StringBuffer();
            
            for(int j=i; j<length + i; j++){ //문자열을 순회하는 반복문
                if(length-1 < j){ //j가 문자열 길이보다 더 커지는 순간에만
                    sb.append(s.charAt(j-length));
                }else{
                    sb.append(s.charAt(j));
                }
            }
            boolean isValid = true;
            for(int k=0;k<sb.length();k++){
                char c = sb.charAt(k);
                if(c=='{' || c == '[' || c=='('){
                    stack.push(c);
                }else{
                    if(stack.isEmpty()){
                        isValid = false;
                        break;
                    }
                    char top = stack.pop(); //스택의 상위 요소를 가져옴
                    if(c == '}' && top != '{'){
                        isValid = false;
                        break;
                    }else if(c == ']' && top != '['){
                        isValid = false;
                        break;
                    }else if(c == ')' && top != '('){
                        isValid = false;
                        break;
                    }
                }
            }
            if(isValid && stack.isEmpty()){
                cnt++;
            }
        }
        return cnt;
    }
}

profile
컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다. -마틴 파울러
post-custom-banner

0개의 댓글