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

작성자 : 조회수 :

제목 : 괄호 회전하기

 

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

 



개인적으로 저기 올라온 예시 때문에 어렵게 느껴졌지만 결국 간단했습니다.

문제를 간단하게 만들면

 

1.     문자열로 이루어진 괄호들은 전부 남는 없이 짝이 있어야 합니다.

 

처음에는 왼쪽 이동이라 모두 swap 생각이였지만 그럴 필요없이 시작 인덱스를 하나씩 추가해주면

쉽게 문제는 있었습니다.

 

 

아래처럼 시작인덱스만 바꿔준다면 쉽게 왼쪽이동처럼 만들어줄 있었습니다.

 



이제 괄호 짝만 구해주면 됩니다.

 

STACK 통해서 문제를 쉽게 있습니다





닫는 괄호가 감지되면 최근 push 값이 여는괄호인지 체크한후 맞다면 push하지 않고 pop해줍니다

 

고로 stack 쌓이지 않고 모두 pop 된다면 홀로 짝없는 괄호가 없으니 올바른 괄호 문자열이라고 있습니다

 

아래 코드를 본다면 이해하기 빠를 겁니다.


package Question;

import java.util.Stack;

/**

 * 괄호 회전하기

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

 * stack으로 풀어주어야함

 * 풀이 출처 https://velog.io/@joonghyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B4%84%ED%98%B8%ED%9A%8C%EC%A0%84%ED%95%98%EA%B8%B0-%EC%9E%90%EB%B0%94

 * */

public class RotatingParentheses {

    public static void main(String[] args) {

        // list 처음과 마지막 비교

        System.out.println(solution("}]()[{"));

    }

    public static int solution(String s) {

        int answer = 0;

        char[] sChar = s.toCharArray();

        // 옆으로 이동시킬 필요없이 하나씩 뒤로 밀어서 읽어주면됨

        // 배열의 길이만큼 그리고 0번째와 마지막번째만 붙여서 비교해보면됨

        // { 이거일때 } 이게 오면 1 이런식으로

        // 문자열길이만큼 반복

        for (int i = 0; i < s.length(); i++) {

            String words = "";

            // 시작 인덱스는 i , 인덱스는 무조건 i-1

            int index = i;


            for (int j = 0; j < s.length(); j++) {

                words += sChar[index];

                // 끝에 도달

                if(index == s.length()-1){

                    index = 0; // 0으로 순환

                }else{

                    index++;

                }

            }

            // 검사

            // 단계별로 받고 비어있으면 ++;

            Stack<String> stack = new Stack<>();

            char[] wordChars = words.toCharArray();

            for(int j = 0; j < s.length(); j++){

                String indexString = String.valueOf(wordChars[j]);

                if(stack.isEmpty()){

                    stack.push(indexString);

                }else if(indexString.equals(")") && stack.peek().equals("(")){

                    stack.pop();

                }else if(indexString.equals("]") && stack.peek().equals("[")) {

                    stack.pop();

                } else if (indexString.equals("}") && stack.peek().equals("{")) {

                    stack.pop();

                }else{

                    stack.push(indexString);

                }

            }

            if(stack.isEmpty()){

                answer++;

            }

            words = "";

        }

        return answer;

    }

}

이번 문제는 이해하는데 다소 어려움이 있었습니다. 문제 때문인지는 모르겠지만 제가 너무 어렵게 접근을 해서

생긴 문제였습니다. 어찌보면 엄청 간단한 문제였으나 다른이들의 문제 풀이를 보고 나서야 깨달았습니다.

 

이건 문제 푸는 경험이 적어서 발생한 문제라고 생각이 듭니다.

 

 

 

 

 

 

참고 블로그 :

https://velog.io/@joonghyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B4%84%ED%98%B8%ED%9A%8C%EC%A0%84%ED%95%98%EA%B8%B0-%EC%9E%90%EB%B0%94