본문 바로가기
Java/알고리즘

괄호 회전하기

by 티코딩 2023. 10. 16.

ㅇ 문제

먼저 문제를 꼼꼼히 읽으며(그렇지 못했다. 그래서 한시간날림)

수도코드를 작성해보면,

// 1.문자열을 왼쪽으로 한칸씩 이동하는로직

// 첫번째문자 따로 빼놓기

// 두번째문자부터 한칸씩 왼쪽으로 이동

// 아까첫번째 문자는 맨마지막으로ㄱㄱ

// 2. 이과정에서 나온 char[]을 유효한지 검증

// 빈스택만들기

// 스택에 여는괄호면 푸쉬, 닫는괄호면 팝

// 두개 짝 맞는지 비교한다.

// 3. 이과정을 반복한다.

 

 

ㅇ 1트

public static int solution(String s) {
        int answer = 0;
        //문자열s 가 널이거나 비어있을경우 그냥 0
        if (s == null || s.isEmpty()) {
            return 0;
        }
		
        char[] chars = s.toCharArray();
        //s길이-1만큼 반복
        for (int move = 0; move < s.length() - 1; move++) {
            char firstChar = chars[0];
            // 두 번째 문자부터 한 칸씩 왼쪽으로 이동
            for (int i = 1; i < chars.length; i++) {
                chars[i - 1] = chars[i];
            }
            // 맨 뒤자리에 아까의 첫 번째 원소 넣기
            chars[chars.length - 1] = firstChar;
            Stack<Character> stack = new Stack<>();
            // 올바른 괄호인지 검증
            for (char bracket : chars) {
                if (bracket == '{' || bracket == '(' || bracket == '[') {
                    stack.push(bracket);
                } else {
                    if (stack.isEmpty()) {
                        answer = 0;//
                        break;
                    }
                    char openBracket = stack.pop();
                    if ((bracket == '}' && openBracket != '{') ||
                            (bracket == ')' && openBracket != '(') ||
                            (bracket == ']' && openBracket != '[')) {
                        answer = 0;
                        break;
                    }
                }
            }
            if (stack.isEmpty()) {
                answer++;
            }
        }
        return answer;
    }

힘들게 만들었는데, 자꾸 내가 원하는 답이 안나왔다.

ㅇ 2트

public static int solution(String s) {
        int answer = 0;
        //문자열s 가 널이거나 비어있을경우 그냥 0
        if (s == null || s.isEmpty()) {
            return 0;
        }

        char[] chars = s.toCharArray();
        //s길이-1만큼 반복
        for (int move = 0; move < s.length() - 1; move++) {
            char firstChar = chars[0];
            // 두 번째 문자부터 한 칸씩 왼쪽으로 이동
            for (int i = 1; i < chars.length; i++) {
                chars[i - 1] = chars[i];
            }
            // 맨 뒤자리에 아까의 첫 번째 원소 넣기
            chars[chars.length - 1] = firstChar;
            Stack<Character> stack = new Stack<>();
            boolean isValid = true;
            // 올바른 괄호인지 검증
            for (char bracket : chars) {
                if (bracket == '{' || bracket == '(' || bracket == '[') {
                    stack.push(bracket);
                } else {
                    if (stack.isEmpty()) {
                        isValid = false;
                        break;
                    }
                    char openBracket = stack.pop();
                    if ((bracket == '}' && openBracket != '{') ||
                            (bracket == ')' && openBracket != '(') ||
                            (bracket == ']' && openBracket != '[')) {
                        isValid = false;
                        break;
                    }
                }
            }
            if (isValid == true && stack.isEmpty()) {
                answer++;
            }
        }
        return answer;
    }

answer를 자꾸 반복문에서 초기화시켜줬기 때문에 안되는거였다. 그래서 boolean을 써서 마지막 answer++ 부분에 isValid가 true이면서, stack이 전부다 빠져나왔을때 그제서야 answer++를해줬다. 그랬더니 테스트 11빼곤 다 통과된것이었다.

ㅇ 3트

다시 보니, 한번 옮기고나서부터 유효성을 검증하고 있었다. 다시 생각해보니 시작할때 문자열을 검증하지 않았던 것이다. 

현재위치에서 유효성검증을 안했던것. 그래서 원래는 반복을 s의 길이-1만큼했지만 s길이만큼 반복을해서 왼쪽으로 이동을 계속해서 원래 모습까지 이동을 해서 처음 모습도 유효성 검증을 하는방법을 택했다. 주석처리 해놓은 밑에 반복문 에서 -1만 빼줬더니 모두 통과했다. 어이없다.

바보 벙슨

public static int solution(String s) {
        int answer = 0;
        //문자열s 가 널이거나 비어있을경우 그냥 0
        if (s == null || s.isEmpty()) {
            return 0;
        }

        char[] chars = s.toCharArray();
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        //s길이만큼 반복!!!!!!!!!!!!!!!!!!!!!!!
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        for (int move = 0; move < s.length(); move++) {
            char firstChar = chars[0];
            // 두 번째 문자부터 한 칸씩 왼쪽으로 이동
            for (int i = 1; i < chars.length; i++) {
                chars[i - 1] = chars[i];
            }
            // 맨 뒤자리에 아까의 첫 번째 원소 넣기
            chars[chars.length - 1] = firstChar;
            Stack<Character> stack = new Stack<>();
            boolean isValid = true;
            // 올바른 괄호인지 검증
            for (char bracket : chars) {
                if (bracket == '{' || bracket == '(' || bracket == '[') {
                    stack.push(bracket);
                } else {
                    if (stack.isEmpty()) {
                        isValid = false;
                        break;
                    }
                    char openBracket = stack.pop();
                    if ((bracket == '}' && openBracket != '{') ||
                            (bracket == ')' && openBracket != '(') ||
                            (bracket == ']' && openBracket != '[')) {
                        isValid = false;
                        break;
                    }
                }
            }
            if (isValid == true && stack.isEmpty()) {
                answer++;
            }
        }
        return answer;
    }

이렇게 허무한 코테 끝ㅠ

스택사용법을 익혀두자.

'Java > 알고리즘' 카테고리의 다른 글

프로세스  (1) 2023.10.18
기능개발  (0) 2023.10.17
H-Index  (0) 2023.10.13
숫자의 표현  (0) 2023.10.12
영어 끝말잇기  (0) 2023.10.11