똘이의 개발 Life

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

코딩테스트/프로그래머스

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

또리또리똘 2024. 1. 24. 12:01
728x90

문제 출처

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

걸린 시간

10:14 ~ 11:33 // 소요 시간 1시간20분

피드백

처음 문제 풀었는데 98점 받고 ( solution 1 메소드 참고 ) 

아예 방향 틀어서 100점짜리로 풀었다..( soltution 메소드 참고 )

문제

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

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

대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.

제한 사항

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

예시

s result
"[](){}" 3
"}]()[{" 2
"[)(]" 0
"}}}" 0

 

입출력 예 #1

  • 다음 표는 "[](){}" 를 회전시킨 모습을 나타낸 것입니다.

x s를 왼쪽으로 x칸만큼 회전 올바른 괄호 문자열?

0 "{}" O
1 "](){}[" X
2 "(){}[]" O
3 "){}[](" X
4 "{}" O
5 "}{" X
  • 올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.

입출력 예 #2

  • 다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.

x s를 왼쪽으로 x칸만큼 회전 올바른 괄호 문자열?

0 "}]()[{" X
1 "]()[{}" X
2 "()[{}]" O
3 ")[{}](" X
4 "{}" O
5 "{}]()[" X
  • 올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.

입출력 예 #3

  • s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

입출력 예 #4

  • s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

수도코드

없음.

 

소스 코드 ( 자세한 내용 주석 참고 )


class Solution {
    public int solution(String s) {
        int answer = 0;
        
        StringBuffer sb = new StringBuffer(s);
        
        // 한바꾸 돌기 
        for( char temp :  s.toCharArray() ){
            // 첫 문자열 지우고 
            sb.deleteCharAt(0);
            // 뒤에 붙히기
            sb.append(temp);
            // 문자열
            s = sb.toString();
            // 괄호 체크
            // replace 했는데 둘이 길이가 같거나 
            // 원래 배열이 0일 경우
            
            // flag true : 성공 false : 실패
            boolean flag = true;
            
            String newStr = "";
            
            while( true ){
                String oldStr = s;
                
                // 괄호 지우기
                s = s.replace( "()" , " " ).replace("{}" , " " ).replace( "[]" , " ");
                // 공백 지우기 
                s = s.replace(" " , "");
                
                if( oldStr.length() == s.length() ){
                    break;
                }
            }
            
            if( s.length() == 0 ){
                answer++;
            }
            
        }
        
        
        return answer;
	}

    public int solution1(String s) {
        int answer = -1;
        
        // 닫는 괄호가 먼저 나오면 
        // 그 케이스는 no count 
        int len = s.length();
        int successCnt = 0;
        
        // 첫 인덱스부터 마지막 인덱스까지
        for( int i = 0; i < len ; i++ ){
            // 시작 인덱스
            int start_idx = i; 
            // 실패 체크 
            boolean failFlag = false; 
            // 열린 괄호 카운트 0 : 소 , 1: 중 , 2: 대
            int[] openCnt = new int[3];
            // 닫힌 괄호 카운트 0 : 소 , 1: 중 , 2: 대
            int[] closeCnt = new int[3];
            // ex ) 0 ~ len | 4 ~ len + 4 | 시작한 곳부터 시작 전까지 돌기
            for( int j = start_idx ; j < len + start_idx ; j++ ){
                // len 넘어 갈 경우 0으로 돌아가는 연산
                char checkChar = s.charAt( j % len ); 
                // 닫힌 괄호나 왔을 경우
                if( ( checkChar == ')' ||
                    checkChar == '}' ||
                    checkChar == ']' ) ){
                    // 닫힌 괄호 카운트 
                    if(checkChar == ')'){
                        closeCnt[0]++;  
                        // 닫힌 괄호가 더 많을 경우
                        if( closeCnt[0] > openCnt[0] ) {
                            // 실패
                            failFlag = true; 
                            break; 
                        }
                    } 
                    if(checkChar == '}'){
                        closeCnt[1]++;  
                        // 닫힌 괄호가 더 많을 경우
                        if( closeCnt[1] > openCnt[1] ) {
                            // 실패
                            failFlag = true; 
                            break; 
                        }
                    } 
                    if(checkChar == ']'){
                        closeCnt[2]++;  
                        // 닫힌 괄호가 더 많을 경우
                        if( closeCnt[2] > openCnt[2] ) {
                            // 실패
                            failFlag = true; 
                            break; 
                        }
                    } 
                }
                // 열린 괄호가 나왔을 경우
                else{
                    if(checkChar == '(') openCnt[0]++;
                    if(checkChar == '{') openCnt[1]++;
                    if(checkChar == '[') openCnt[2]++;
                }
            }
            
            // 탐색이 끝나고 나서 
            // 개수가 같지 않은게 있다면
            if( openCnt[0] != closeCnt[0] ||
                openCnt[1] != closeCnt[1] ||
                openCnt[2] != closeCnt[2] ){ 
                failFlag = true;
            }
            // 실패한 적 없으면 
            if( !failFlag ){
                // 성공 1 카운트
                successCnt++;
            }
            
        }
        
        answer = successCnt;
        
        return answer;
	}

}
728x90