https://school.programmers.co.kr/learn/courses/30/lessons/76502?language=javascript
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
function solution(s){
const n = s.length;
let answer = 0;
for(let i = 0; i < n; i++){
const stack = [];
let isCorrect = true;
for(let j =0; j < n; j++){
const c = s[(i+j) % n];
if(c ==='[' || c === '{' || c === '('){
stack.push(c);
}
else {
if(stack.length === 0){
isCorrect = false;
break;
}
const top = stack[stack.length - 1];
if(c === ']' && top === '['){
stack.pop();
}
else if(c === '}' && top === '{'){
stack.pop();
}
else if(c === ')' && top === '('){
stack.pop();
}
else {
isCorrect = false;
break;
}
}
}
if(isCorrect && stack.length === 0){
answer += 1;
}
}
return answer
}
이 문제에서 가장 헷갈렸던 건 괄호를 회전시키는 것이다.
간단하게 해석을 해보면 i 가 첫번째 문자의 위치를 가리키며 j는 이후 등장하는 문자를 가리키는 인덱스이다.
const c = s[(i+j) % n];
즉, 이 코드가 시작 지점 부터 1씩 더한 다음 입력값의 길이만큼 나누면 뒤로 이동시킨 문자를 가리키게 된다.
그 이후부턴 평범한 괄호 맞추기와 동일하다.
1. 열린 괄호면 스택 push
2. 닫힌 괄호를 넣을 때 스택의 길이를 확인해서 0이면 잘못된 괄호짝이므로 다음 순서로 넘긴다.
3. 닫힌 괄호를 넣을때 스택 길이가 0이 아니면 stack의 가장 위의 값을 확인하여 짝이 맞으면 pop
4. 입력값 전부 진행 후 스택에 남는 값이 없어야 정상적인 괄호짝이므로 answer + 1
'코딩테스트 연습 > Stack' 카테고리의 다른 글
[Programmers] 주식 가격 (1) | 2024.10.09 |
---|