스터디/99클럽 코테 스터디 TIL

99클럽 코테 스터디 28일차 괄호 회전하기

Been 2024. 8. 19. 02:21

📝 문제

 

프로그래머스

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

programmers.co.kr

🔥 시도해본 접근 방식

1. 문자열s를 한 문자씩 잘라 Queue로 선언
2. Queue를 이용하여 맨 앞 문자를 뽑아서 뒤로 붙이는 방식으로 s의 길이만큼 s를 회전 시키는 반복문 선언
3. Queue에 있는 문자길이만큼 반복하는 반복문선언
4. 문자열의 문자 하나씩 Stack에 넣으면서 괄호가 모두 완성되면 answer를 1 증가시키고 괄호가 완성되지 않으면 문자열을 회전후 [3] 부터 재시도

 

1️⃣ 첫번째 시도

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

class Solution {
    public int solution(String s) {
        // 문자열의 맨 앞 문자를 뽑아서 뒤로 붙이는 방식으로 문자열을 회전시키기 위해 Queue 사용
        Queue<String> sQueue = new LinkedList<>();
        for (int i = 0; i < s.length(); i++) {
            sQueue.offer(String.valueOf(s.charAt(i)));
        }

        int answer = 0;

        // s의 길이만큼 s를 회전 시키는 반복문 선언
        for (int i = 0; i < s.length(); i++) {
            // sQueue를 복제
            Queue<String> tempQueue = new LinkedList<>(sQueue);

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

            for (int j = 0; j < s.length(); j++) {
                tempStack.push(tempQueue.poll());

                if (tempStack.peek().equals(")") || tempStack.peek().equals("}") || tempStack.peek().equals("]")) {
                    if (tempStack.size() < 2) {
                        break;
                    }

                    String u = tempStack.pop() + tempStack.pop();

                    if (!(u.equals(")(") || u.equals("}{") || u.equals("]["))) {
                        break;
                    }
                }

                // 정상적으로 반복문을 모두 마친 경우 +1
                if (j == s.length() - 1) {
                    answer++;
                }
            }

            // 문자열을 왼쪽으로 한칸 회전
            sQueue.offer(sQueue.poll());
        }

        return answer;
    }
}

 

한가지 케이스에서 실패가 떴다. 예외케이스가 있는듯 하다.

잘못된 조건식으로 인해 문자열이 "{{{" 와 같이 들어가면 카운트가 되는 결함을 발견하였다.

✨ 성공 코드

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

class Solution {
    public int solution(String s) {
        int answer = 0;

        if(s.length() == 1) return answer;

        // 문자열의 맨 앞 문자를 뽑아서 뒤로 붙이는 방식으로 문자열을 회전시키기 위해 Queue 사용
        Queue<String> sQueue = new LinkedList<>();
        for (int i = 0; i < s.length(); i++) {
            sQueue.offer(String.valueOf(s.charAt(i)));
        }

        // s의 길이만큼 s를 회전 시키는 반복문 선언
        for (int i = 0; i < s.length(); i++) {
            // sQueue를 복제
            Queue<String> tempQueue = new LinkedList<>(sQueue);

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

            for (int j = 0; j < s.length(); j++) {
                tempStack.push(tempQueue.poll());

                if (tempStack.peek().equals(")") || tempStack.peek().equals("}") || tempStack.peek().equals("]")) {
                    if (tempStack.size() < 2) {
                        break;
                    }

                    String u = tempStack.pop() + tempStack.pop();

                    if (!(u.equals(")(") || u.equals("}{") || u.equals("]["))) {
                        break;
                    }
                }

                // 정상적으로 반복문을 모두 마친 경우 +1
                if (j == s.length() - 1 && tempStack.size() == 0) {
                    answer++;
                }
            }

            // 문자열을 왼쪽으로 한칸 회전
            sQueue.offer(sQueue.poll());
        }

        return answer;
    }
}