시리즈: 알고리즘 (32개 글)
- 자바로 알고리즘 풀기
- [Java] 백준 10431 - 줄 세우기
- [Java & Node.js] 백준 9935 - 문자열 폭발
- [Node.js] 백준 22866 - 탑 보기
- [Java] 백준 4485 - 녹색 옷 입은 애가 젤다지?
- [Node.js] 백준 1283 - 단축키 지정
- [Java & Node.js] 백준 14469 - 소가 길을 건너간 이유 3
- [Java] 백준 8979 - 올림픽
- [Node.js] 백준 22866 - 탑 보기
- [Java] 백준 7568 - 덩치
- [Java] 백준 1244 - 스위치 켜고 끄기
- [Node.js] 백준 19941 - 햄버거 분배
- [Node.js] 백준 1254 - 팰린드롬 만들기
- [Java] 백준 2589 - 보물섬
- [Java] 백준 2309 - 일곱 난쟁이
- [Java] 백준 1789 - 수들의 합
- [Java] 백준 1987 - 알파벳
- [Node.js] [Rust] 백준 24460 - 특별상이라도 받고 싶어
- [Node.js] 백준 7576 - 탑 보기
- [Rust] 백준 1047 - 울타리 (N^4 브루트포스 + 그리디)
- [Node.js] 백준 9657 - 돌게임3
- [Rust] 백준 4963 - 섬의 개수
- [Node.js] 프로그래머스 - 모의고사 / 실패율
- [Rust] 백준 2667 - 단지번호붙이기
- [Node.js] 프로그래머스 - 방문 길이
- [Node.js] 프로그래머스 - 괄호 회전하기
- [Rust] 백준 1002 - 터렛
- [Node.js] 프로그래머스 - 크레인 인형뽑기 게임
- [Node.js] 프로그래머스 - 기능개발
- [Rust] 백준 13717 - 포켓몬 GO
- [JavaScript] 백준 1092 - 배
- [Rust] 백준 25329 - 학생별 통화 요금 계산
문제
스택 + 문자열
문제 풀이
O(N^2) 으로 해결해야 할 듯 하다.
접근
- 회전을 구현해야 한다
- 괄호가 유효한지 검사 해야한다.
아! 스택으로 접근하면 되겠군!
의사코드와 설계
Solution : 메인 루프
길이가 홀수인지 확인한다. (홀수 괄호는 짝을 이룰 수 없으니 불가능)
0부터, 주어진 문자열 길이까지 반복
회전 -> s.substring(x)과 s.substring(0,x)를 통해 문자열을 회전시키자
checkCorrect : 검사
스택과 괄호 짝 판단을 위한 매핑 PAIR를 추가
문자열을 순회하며 열린 괄호는 스택에 넣고, 닫힌 괄호가 나온다면 스택과 비교해서 짝이 맞는지 확인 (PAIR 매핑 사용)
순회 후 스택이 전부 비었는지 판단하여 가능 여부를 반환 (true/false)
최종 코드
function solution(s) {
const sLen = s.length;
let answer = 0;
if (sLen % 2 !== 0) return 0;
for (let x = 0; x < sLen; x++) {
const rotated = s.substring(x) + s.substring(0, x);
if (checkCorrect(rotated)) {
answer++;
}
}
return answer;
}
function checkCorrect(s) {
const st = [];
const PAIRS = {
")": "(",
"]": "[",
"}": "{",
};
for (const char of s) {
if (char === "(" || char === "[" || char === "{") {
st.push(char);
} else if (char === ")" || char === "}" || char === "]") {
if (st.length === 0) {
return false;
}
const last = st.pop();
if (last !== PAIRS[char]) {
return false;
}
}
}
return st.length === 0;
}
마무리
간만에 다룬 스택. 이전에 문제 풀 때는 괜히 top 이런거랑 하나하나 구현해서 해보려고 했으나, 역시 push() 쓰는편이 훨씬 편하다.
코테를 더욱 빡세게 준비해야 하는 것이 맞는 것 같아서 하나하나 풀어보고 있으나, 쉽지 않다. 하지만 차근차근 하다보면 언젠가 되지 않을까!?
화이팅화이팅!!
-뱅-
