알고리즘/프로그래머스

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

https://programmers.co.kr/learn/courses/30/lessons/76502

 

코딩테스트 연습 - 괄호 회전하기

 

programmers.co.kr

1. 유형

구현, 문자열, 스택

 

2. 로직

  1. 문자열 회전하는 코드
  2. 올바른 괄호인지 판단

[](){}문자열을 회전하면 ](){}[이 된다.

이런 문자열을 만드려면 덱 자료구조를 사용한다.

맨 앞의 엘리먼트를 빼고 맨 뒤에 추가해준다.

이것을 s의 길이만큼 반복해준다.

 

올바른 괄호판단은 너무 흔한 유형이고, Stack을 사용해서 판단한다

  1. 닫는 괄호가 나왔을때, stack의 맨 위의 엘리먼트가 한쌍을 이루는지 판단
  2. 만약 닫는 괄호인 경우, stack이 비어있거나, 쌍이 맞지 않으면 틀린 문자열이 된다.

3. 코드

import java.util.*;
class Solution {
    public int solution(String s) {
        int answer = 0;
        char arrays[] = s.toCharArray();
        Deque<Character> deq = new LinkedList<>();
        for(char c: arrays){
            deq.addLast(c);
        }
        for(int i=0; i<s.length(); i++){
            if(check(deq)){
                answer++;
            }
            char temp = deq.pop();
            deq.addLast(temp);
        }
        return answer;
    }
    static boolean check(Deque<Character> deq){
        Deque<Character> copydeq = new LinkedList<>();
        copydeq.addAll(deq);
        Stack<Character> stack = new Stack<>();
        int size = deq.size();
        for(int i=0; i<size; i++){
            char head = copydeq.removeFirst();
            if(head=='{' || head=='[' || head=='('){
                stack.add(head);
            }else{
                if(stack.isEmpty()){
                    return false;
                }else{
                    if(checkpair(stack.peek(), head)){
                        stack.pop();
                    }else
                        return false;
                 }
            }
        }
        if(stack.size()==0)
            return true;
        else
            return false;
    }
    static boolean checkpair(char top, char current){
        if(top=='{' && current=='}'){
            return true;
        }else if(top=='[' && current==']')
            return true;
        else if(top=='(' && current==')')
            return true;
        else
            return false;
    }
}
/*
1) 회전하는 코드
    마지막 행을 맨 앞으로
    덱을 사용
2) 올바른 문자열 판단
    if 여는 괄호:
        스택에 추가
    else:
        if stack이 빔:
            return false
        else if stack의 맨위하고 맞지않음:
            return false
        else:
            stack.pop
            return true
*/