알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

 

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

 

프로그래머스

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

programmers.co.kr


Think🤔

처음에는 한 칸식 옆으로 가는거여서 원순열처럼 2배를 만들어서 비교 또는 스택으로 할 수 있겠다 생각했음.


[](){}
](){}[
(){}[]
길이만큼 회전 시킴 그리고 완벽한지 체크

char ch = tmp.charAt(j);

if(ch == '['){
    arr[0] = arr[0]++;
}else if(ch == '('){
    arr[1] = arr[1]++;
}else if(ch == '{'){
    arr[2] = arr[2]++;
}else if(ch == ']' && arr[0] > 0){
    arr[0] = arr[0]--;
}else if(ch == ')' && arr[1] > 0){
    arr[1] = arr[1]--;
}else if(ch == '}' && arr[2] > 0){
    arr[2] = arr[2]--;
}
                
이렇게 되면 반례되는 파라미터를 넣으니 바로 실패했음

 

tmp의 길이를 원순열처럼 늘리고 Stack을 이용해서 peek()으로 있는지 확인한다음 있으면 꺼내면서 하는 방식으로 했다.

 

그럼 처음에 여는 괄호들 '[ , ( , {' 는 무조건 push를 하고

나머지는 있는지 확인을 한다음 닫는 괄호( '] , ) , }')를 짝지어서 꺼내게 하였다.

하지만 여는 괄호가 없는 경우 X가 나와야 해서 stack에 넣어주었다.  


Solution✍

 

import java.util.HashMap;
import java.util.Stack;

class Solution {
    public int solution(String s) {
        int answer = 0;
        // 원순열 처럼 이용 또는 스택 풀이
        String tmp = s + s;
        
        for(int i=0; i<s.length(); i++){
            Stack<Character> st = new Stack();
            for(int j=i; j<s.length() + i; j++){
                if(st.isEmpty()){
                    st.push(tmp.charAt(j));
                }else if(tmp.charAt(j) == ']' && st.peek() == '['){
                    st.pop();
                }else if(tmp.charAt(j) == ')' && st.peek() == '('){
                    st.pop();
                }else if(tmp.charAt(j) == '}' && st.peek() == '{'){
                    st.pop();
                }else{
                    st.push(tmp.charAt(j));
                }
            }
            if(st.isEmpty()){answer++;}
        }
    
        
        return answer;
    }
}

Review🤩

 

그 전 풀었던 문제랑 연계되었음. Stack 복습.


 

+ Recent posts