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

LeeYulhee·2023년 10월 10일
0

💻 문제 출처 : 프로그래머스_괄호 회전하기

👉 내가 작성한 답


import java.util.*;

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

        int sLength = s.length();
        
        if(sLength % 2 == 1) return 0;
        
        for(int i = 0; i < sLength; i++) {
            
            Stack<Character> stack = new Stack<>();
            int check = 0;
            
            for(int j = 0; j < sLength; j++) {
                char temp = s.charAt((i + j) % sLength);
                if(temp == '[' || temp == '(' || temp == '{') {
                    stack.push(temp);
                } else {
                    if(stack.isEmpty()) break;
                    
                    char stackChar = stack.peek();
                    
                    if((stackChar == '[' && temp == ']') || (stackChar == '(' && temp == ')') || (stackChar == '{' && temp == '}')) {
                        stack.pop();
                        check++;
                    }
                }
            }
            
            if(check == sLength / 2) {
                answer++;
            }
        }
        
        
        return answer;
    }
}
  • 📌 접근 방식
    • s의 길이가 홀수면 괄호가 닫히지 않는 경우가 무조건 있으니 0을 return
    • 왼쪽으로 한 칸씩 이동하는 건 나머지 계산으로 인덱스를 사용하면 됨
      • 0, 1, 2, 3, 4 → 1, 2, 3, 4, 0 → 2, 3, 4, 0, 1처럼 시작 값이 1씩 증가하고 끝나는 값은 시작 값 + 현재 증가 값
    • stack에 괄호의 시작을 넣고, 닫는 괄호가 나오면 stack의 직전 값이 닫는 괄호와 맞는 값이면 stack에서 제거하고 check의 값을 증가
    • check가 s의 길이 / 2와 같으면 전부 stack에서 나온 경우이니까 answer를 증가
  • 📌 문제 풀이 설명
    • int 변수 answer를 선언하고 0으로 초기화, int sLength를 선언하고 s의 길이로 초기화
    • 만약 sLength % 2가 1이면 return 0
      • 홀수인 경우
    • for문으로 0부터 sLength 미만까지 1씩 증가하며 순회
      • Character를 값으로 갖는 stack 생성하고 int 변수 check 생성 후 0으로 초기화
      • for문으로 0부터 sLength 미만까지 1씩 증가하며 순회
        • s의 (i + j) % sLength 인덱스 char를 char temp에 저장
        • 만약 temp가 ‘[’나 ‘(’나 ‘{’와 같다면
          • stack에 temp를 넣음
        • 그게 아니라면
          • 만약 stack이 비어 있다면 break
            • stack이 비어 있으면 시작하는 괄호 없이 닫는 괄호가 나온 거라 완성이 안 되기 때문
          • char 변수 stackChar를 선언하고 stack에 peek 값으로 초기화
          • 만약 stackChar가 ‘[’이고 temp가 ‘]’거나 stackChar가 ‘(’이고 temp가 ‘)’거나 stackChar가 ‘{’이고 temp가 ‘}’인 경우
            • stack에서 pop으로 값 제거
            • check의 값 1 증가
      • 중첩 for문 종료 후 만약 check가 sLength / 2와 같다면
        • answer 1 증가
    • for문 종료 후 return answer



👉 다른 사람이 작성한 답


import java.util.Stack;

class Solution {
    private final Stack<Character> stack = new Stack<>();

        public int solution(String s) {
            int answer = 0;
            StringBuilder stringBuilder = new StringBuilder(s);

            for (int i = 0; i < s.length(); i++) {
                stringBuilder.append(stringBuilder.charAt(0));
                stringBuilder.deleteCharAt(0);
                if (correctParenthesis(stringBuilder.toString().toCharArray()))
                    answer++;
            }
            return answer;
        }

        private boolean correctParenthesis(char[] s) {
            for (char c : s) {
                if (!(check(c, '(', ')') && check(c, '[', ']') && check(c, '{', '}')))
                    return false;
            }
            return stack.isEmpty();
        }

        private boolean check(char c, char a, char b) {
            if (c == a)
                stack.push(a);
            else if (c == b)
                if (!stack.isEmpty() && stack.peek() == a) stack.pop(); else return false;
            return true;
        }
}
  • 📌 접근 방식
    • StringBuilder의 append와 delete로 배열을 회전되게 만들고 검증
  • 📌 문제 풀이 설명
    • Character를 값으로 갖는 stack 생성
    • solution 메서드
      • int 변수 answer를 선언하고 0으로 초기화
      • s의 값을 갖는 StringBuilder를 생성
      • for문으로 0부터 s의 길이 미만까지 1씩 증가하며 순회
        • stringBuilder의 0번째 값을 뒤에 추가
        • stringBuilder의 0번째 값을 삭제
          • 위 과정으로 배열이 매번 회전됨
        • 만약 stringBuilder를 String으로 변환하고 char 배열로 변환해서 correctParenthesis에 인수로 넣었을 때, true면 answer 1 증가
          • correctParenthesis 메서드
            • 향상된 for문으로 char 배열 순회
              • 만약 check에 c와 괄호들을 넣어서 실행한 값이 false라면 return false
                • check 메서드
                  • 만약 c가 a와 같다면(여는 괄호와 같다면) stack에 a를 넣음
                  • 그게 아니고 c가 b와 같다면(닫는 괄호와 같다면)
                    • 만약 stack이 비어 있지 않고 stack의 peek 값이 a(여는 괄호)와 같다면
                      • stack에서 pop으로 값을 제거
                    • 그게 아니라면 return false
                  • if문 종료 후 return true
              • for문 종료 후 stack.isEmpty()의 값을 return
      • for문 종료 후 return answer
profile
공부 중인 신입 백엔드 개발자입니다

0개의 댓글