알고리즘 풀이 방법입니다.
문제(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 복습.
'Algorithm' 카테고리의 다른 글
[프로그래머스 , 리트코드] 시즌3 n^2 배열 자르기 , 행렬의 곱셈 , 의상 , H-Index , [1차] 캐시 , 기능개발 , 튜플 (4) | 2024.09.04 |
---|---|
[프로그래머스] 할인 행사 (0) | 2024.06.18 |
[프로그래머스] 연속 부분 수열 합의 개수 (0) | 2024.05.01 |
[프로그래머스] 멀리 뛰기 , 귤 고르기 (0) | 2024.04.23 |
[프로그래머스] N개의 최소공배수 (1) | 2024.04.17 |