본문 바로가기

코딩/프로그래머스

[프로그래머스/JAVA] 코딩테스트 연습 > 월간 코드 챌린지 시즌2 > 괄호 회전하기 (by 다알쥐AI)

728x90
반응형

틱톡라이트 초대링크 https://lite.tiktok.com/t/ZSjqX7SfC/

[기간 한정] 보는 재미로, 버는 재미로! 영상만 봐도, 좋아요만 눌러도, 검색만 해도, 포인트가 차

www.tiktok.com


[
괄호 회전하기 ] 코딩테스트 연습 > 월간 코드 챌린지 시즌2 > 괄호 회전하기

 
 
※ 주의 : 문제풀이 방법은 다양합니다. 참고만 해주세요
[문제설명]

더보기

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

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

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


제한사항

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

입출력 예



입출력 예 설명

입출력 예 #1

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

  • 올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.

입출력 예 #2

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

 

  • 올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.

입출력 예 #3

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

입출력 예 #4

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

[간단설명]
괄호로 만들어진 문자열을 한칸씩 이동시키면서, 올바른 괄호가 만들어지는 경우의 수 구하기
 
[접근방법]
1. 주어진 문자열을 char 배열로 저장한다.
2. 올바른 괄호인지 확인한다.
ㄴ 스택 사용
3. 문자열을 한칸씩 이동시킨다.
4. 주어진 문자열 길이만큼 반복한다.
5. 올바른 괄호 개수를 리턴
 
[주의사항]
- 괄호 문제는 스택으로 푸는 경우가 많다.
ㄴ 시작 괄호면 스택에 넣고, 종료 괄호면 스택에서 꺼내는 식으로 구현하자.
- 문자열이 시작 괄호( '(', '{' ,'[' )로 시작 안하는 경우가 있으니 주의하자.
 
[소스공개]

import java.util.*;
class Solution {
    public int solution(String s) {
        // 캐릭터 배열
        char[] ch = new char[s.length()];
        // 캐릭터 배열 세팅
        int idx=0;
        for(char c : s.toCharArray()){
            ch[idx++] = c;
        }

        // 변수 초기화
        idx=0;
        int cnt=0;
        while(idx<ch.length){
            // 괄호가 올바르면
            if(isCorrect(ch)){
                cnt++; // 올바른 괄호 개수 +1
            }
            // 문자열 이동
            ch = moveChar(ch);
            idx++;
        }
      
        // 올바른 괄호 개수 리턴
        return cnt;
    }
    // 문자열 이동
    public char[] moveChar(char[] c){
        char[] new_c = new char[c.length];
        for(int i=0;i<c.length;i++){
            new_c[i]=c[(i+1)%c.length]; // 한칸씩 뒤로 미룬다
        }
        return new_c;
    }
    // 올바른 괄호 판별 
    public boolean isCorrect(char[] c){
        // 스택 사용
        Stack<Character> stack = new Stack<>();
        // 시작 괄호('[','(','{'] 개수 카운트
        int cnt=-1;
        for(int i=0;i<c.length;i++){
            // 시작 괄호 이면 push
            if(c[i]=='[' || c[i]=='(' || c[i]=='{'){
                stack.push(c[i]);
                cnt++;
            // 종료 괄호 이면 pop
            }else{
                // 괄호 비교를 위해서 end값을 시작 괄호 값으로 세팅
                char end='Z';
                if(c[i]==']') end='[';
                else if(c[i]==')') end='(';
                else if(c[i]=='}') end='{';
                // 스택이 비어있지 않고, 괄호가 같으면
                // 위에서 종료 괄호를 시작 괄호로 바꿈
                if(!stack.isEmpty() && end==stack.peek()){
                    char d = stack.pop();
                }
            }
        }
        // 시작괄호가 없으면 false
        if(cnt==-1) return false;
        
        // 스택 사이즈가 0이면 true(스택에서 모두 꺼냈으면)
        return stack.size()==0?true:false;
    }
}

 
[실행결과]

 

반응형