Mini
[스택] 프로그래머스 괄호회전하기 // 회전하지 말고 뒤에붙여라 본문
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
* 풀이1
직접회전
[이면 push 아니면 pop
반례 -> }}} 만 오는 경우 true 가 되버림 -> leftCnt로 left의 갯수가 없다면 false 리턴
import java.util.*;
class Solution {
String rotate(String s){
return s.substring(1) + s.charAt(0);
}
boolean check(String s){
int leftCnt=0;
Stack<Character> stk = new Stack<>();
for(int i=0;i<s.length();++i){
char cur = s.charAt(i);
if(s.charAt(i)=='[' || s.charAt(i)=='(' || s.charAt(i)=='{'){
leftCnt++;
stk.push(s.charAt(i));
}
else if(stk.size()>0 && cur==']' && stk.peek()=='['){
stk.pop();
}
else if(stk.size()>0 && cur==')' && stk.peek()=='('){
stk.pop();
}
else if(stk.size()>0 && cur=='}' && stk.peek()=='{'){
stk.pop();
}
}
return stk.isEmpty() && leftCnt!=0;
}
public int solution(String s) {
int answer = 0;
int n=s.length();
for(int i=0;i<n;++i){
// System.out.println(s);
if(check(s)) answer++;
s=rotate(s);
}
return answer;
}
}
* 풀이2
회전하지말고 뒤에 붙여라!

Stack대신 ArrayDequeue를 써라
if문대신 map을 사용하라.
반복문에 이름붙이는법.
우측괄호가 in -> stk가 빔 -> false!
import java.util.*;
class Solution {
public int solution(String s) {
int answer=0;
int n=s.length(); //window size
s+=s; // 회전하지말고 붙여라.
HashMap<Character,Character> m = new HashMap<>();
m.put(')','(');
m.put(']','[');
m.put('}','{');
A:for(int i=0;i<n;++i){ //반복문 바로 break 하는방법
ArrayDeque<Character> stk = new ArrayDeque<>(); //Stack대신 ArrayDequeue를 사용하라.
for(int j=i;j<i+n;++j){
char cur = s.charAt(j);
if(!m.containsKey(cur)){ // 좌측괄호인경우
stk.push(cur);
}
else if(stk.isEmpty() || stk.pop()!=m.get(cur)){ //우측괄호} 들어옴 -> 스택이 빔 or 같지않음 -> 무효
continue A; //A로 이동
}
}
if(stk.isEmpty()) answer++; // else if문에 안걸리고 stk가 빈경우, 올바른 괄호
}
return answer;
}
}'Algorithm > 스택' 카테고리의 다른 글
| [스택] 프로그래머스 크레인 인형뽑기 // 배열을 스택으로 바꿔라 (1) | 2025.07.06 |
|---|---|
| [틀림] 프로그래머스 큰수만들기 // 스택, 그리디 (0) | 2025.03.22 |
| [알고리즘] 백준 9935 문자열폭팔 // 폭팔은 스택, 끝문자만 비교하라 (0) | 2025.01.27 |
| [알고리즘] 백준 6549 히스토그램 // 스택 심화, 암기.. (0) | 2025.01.19 |
| [알고리즘] 백준 3015 오아시스 재결합 // 스택 심화 (0) | 2025.01.19 |