(Java)프로그래머스 - 괄호 회전하기

윤준혁·2024년 4월 4일

나의 풀이

import java.util.*;

class Solution {
    public int solution(String s) {
        int answer = 0;
        ArrayList<Character> list = new ArrayList<>();
        
        for (char c : s.toCharArray()) { // 1
            list.add(c);
        }
        
        for (int i = 0; i < list.size(); i++) { // 2
            char temp = list.get(list.size() - 1);
            list.add(0, temp);
            list.remove(list.size() - 1);
            
            Stack<Character> stack = new Stack<>();
            
            for (char c : list) { // 3
                if (stack.isEmpty()) stack.push(c);
                else if (stack.peek() == '(') {
                    if (c == ')') stack.pop();
                    else stack.push(c);
                } else if (stack.peek() == '[') {
                    if (c == ']') stack.pop();
                    else stack.push(c);
                } else if (stack.peek() == '{') {
                    if (c == '}') stack.pop();
                    else stack.push(c);
                }
            }
            
            if (stack.isEmpty()) answer++; // 4
        }
        
        return answer;
    }
}

과정

  1. 주어진 s를 Character형태의 ArrayList에 넣는다
  2. list를 순회하며 마지막 요소를 첫번째에 넣고, 마지막 요소를 제거한 뒤 stack을 선언(나머지 요소는 첫번째에 넣는 순간 뒤로 한칸씩 밀린다)
  3. stack에 list의 요소를 넣으면서 괄호가 완성되면 삭제시킨다
  4. 반복문이 끝난 뒤 stack의 크기가 0이면 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;
        }
}

0개의 댓글