알고리즘/PS - 프로그래머스

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

excited-hyun 2021. 8. 26. 17:28
반응형

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

 

코딩테스트 연습 - 괄호 회전하기

 

programmers.co.kr

 

풀이

 

이 문제는 괄호로 이루어진 문자열을 왼쪽으로 회전해가면서 새로운 문자열을 만들고 그 문자열이 올바른 괄호로 이루어진지 확인하면 됩니다.

대부분 "괄호"가 나오는 문제들은 스택을 사용해서 풀립니다. 이 문제도 마찬가지구요!!

 

X = 0 ~ len-1 까지에 대해서 모두 확인을 해야합니다.

  1. 해당하는 X만큼 회전한 문자열을 생성합니다.
  2. 스택을 이용해서 올바른 괄호 문자열인지 확인합니다

스택을 이용해 올바른 괄호 문자열인지 확인하는 함수

  1. 여는 괄호의 경우 스택에 push
  2. 닫는 괄호의 경우 스택이 비어있는지, 스택의 top이 짝이 맞는 괄호인지 확인합니다.
  3. 문자열의 모든 문자에 대해 완료한 후에 스택이 비어있는지 여부를 확인합니다. (비어있지 않은 경우는 "{{" 이런 경우)

 

import java.util.*;

class Solution {
    public int solution(String s) {
        int answer = 0;
        int len = s.length();
        String move = "";
        
        for(int i=0; i<len; i++){
            //회전한 문자열 생성
            String newS = "";
            for(int j=i; j<len; j++)
                newS = newS + s.charAt(j);
            for(int j=0; j<i; j++)
                newS = newS + s.charAt(j);
            
            //올바른 괄호 문자열인지 확인
            if(check(newS))
                answer++;
            
        }
        return answer;
    }
    
    //올바른 괄호 문자열인지 확인하는 함수
    boolean check (String newS){
        Stack<Character> s = new Stack<Character>();
        int len = newS.length();
        for(int i=0; i<len; i++){
            //여는 괄호는 스택에 push
            if(newS.charAt(i) == '(')
                s.push(newS.charAt(i));
            else if(newS.charAt(i) == '[')
                s.push(newS.charAt(i));
            else if(newS.charAt(i) == '{')
                s.push(newS.charAt(i));
            
            //닫는 괄호는 스택의 top값과 비교
            else if(newS.charAt(i) == ')'){
                //여는 괄호 없이 닫는거 나옴
                if(s.empty())
                    return false;
                //짝이 안맞음
                if(s.peek() != '(')
                    return false;
                s.pop();
            }
            else if(newS.charAt(i) == ']'){
                if(s.empty())
                    return false;
                if(s.peek() != '[')
                    return false;
                s.pop();
            }
            else if(newS.charAt(i) == '}'){
                if(s.empty())
                    return false;
                if(s.peek() != '{')
                    return false;
                s.pop();
            }
                
        }
        //여는 괄호가 더 많은 경우 스택이 비지 않음
        if(!s.empty())
            return false;
        
        return true;
    }
}
728x90
반응형