괄호 회전하기

문제


문제 풀이

입력되는 문자열 길이 `0 ~ s.length() - 1` 까지 한번 씩 자리이동을 하면서 이동을 했을 때의 상태의 문자가 올바른 문자인지 체크하는 문제이다. 

 

기존에 비슷한 문제가 많은데, 여기서 여러번 더 반복하는 형식의 문제로 변환이 되었다. 


나의 답안

public static int solution(String s) {
    int answer = 0;
    int len = s.length();

    for (int i = 0; i < len; i++) {
        Deque<Character> check = new LinkedList<>();
        Deque<Character> deque = new LinkedList<>();

        for (char c : s.toCharArray()) {
            deque.offer(c);
        }
        int count = i;
        while (count > 0) {
            deque.offer(deque.poll());
            count--;
        }
        boolean flag = true;
        a:
        while (!deque.isEmpty()) {
            char cur = deque.poll();
            if (check.isEmpty() && (cur == ')' || cur == ']' || cur == '}')){
                flag = false;
                break;
            }
            if (check.isEmpty()){
                check.offer(cur);
                continue;
            }
            if (cur == '(' || cur == '[' || cur == '{') {
                check.offer(cur);
            } else {
                switch (cur) {
                    case ')':
                        if (check.peekLast() != '(') {
                            flag = false;
                            break a;
                        }
                        check.pollLast();
                        break;
                    case ']':
                        if (check.peekLast() != '[') {
                            flag = false;
                            break a;
                        }
                        check.pollLast();
                        break;
                    case '}':
                        if (check.peekLast() != '{') {
                            flag = false;
                            break a;
                        }
                        check.pollLast();
                        break;
                }
            }
        }

        if (flag && check.isEmpty()) answer++;

    }
    return answer;
}

 


다른 답안

 

import java.util.*;

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

        for(int i = 0; i < strLen; i++)
            answer += cal(s, i, strLen);

        return answer;
    }

    public int cal(String s, int strtIdx, int strLen){
        int ret = 0;
        Stack<Character> st = new Stack<>();

        for(int i = strtIdx; i < strtIdx + strLen; i++){
            int idx = i % strLen;
            char c = s.charAt(idx);

            if(c == '(' || c == '{' || c == '[')
                st.push(c);
            else if(c == ')' || c == '}' || c == ']'){
                if(st.empty())
                    return 0;
                else if((st.peek() != '(' && c == ')') || (st.peek() != '{' && c == '}') || (st.peek() != '[' && c == ']'))
                    return 0;
                else
                    st.pop();
            }
        }

        if(!st.empty())
            return 0;

        return 1;
    }
}

 

'Programmers 문제풀이 > Lv.2' 카테고리의 다른 글

[1차] 캐시  (0) 2023.04.01
귤 고르기  (0) 2023.04.01
멀리 뛰기  (0) 2023.03.31
N개의 최소공배수  (0) 2023.03.31
점프와 순간이동  (0) 2023.03.31