일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 프로그래머스
- 정규표현식문제
- 프로그래머스 자바스크립트 풀이
- 알고리즘
- 프로그래머스 자바스크립트
- TS
- 오블완
- 자료구조
- 티스토리챌린지
- 정렬 알고리즘
- 좌표거리구하기
- mysql스키마
- 깃허브
- TypeScript
- Javascript sort
- 프로그래머스 신규아이디추천
- 자바스크립트 알고리즘
- js 알고리즘
- 맨해튼거리예제
- 맨해튼거리
- binary search
- next.js
- 키패드누르기풀이
- Javascript 정렬
- 자바스크립트 배열
- node.js
- 타입스크립트
- 자바스크립트 정렬
- JavaScript
- MySQL
- Today
- Total
FE PARADISE
프로그래머스 - 괄호 회전하기 ( 자바스크립트 코드 & 풀이 ) 본문
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
우선 변수를 선언하자.
answer : 올바른 괄호 문자열이 되게 하는 회전 수 x의 개수
p : 회전 수 (문제대로 변수명을 "x"로 선언해도 좋을 것 같다. 나는 문자열의 몇번째 포인트의 글자를 맨 앞글자로 두는지를 중점으로 변수명을 선언했다.)
let answer = 0, p = 0;
이제 회전을 해보자. while문으로 회전을 해볼 것이다. 문자열의 길이 - 1 만큼 회전할 것이므로 while문 조건은 다음과 같다.
while(p < s.length)
스택을 이용해서 각 회전에 대한 문자열을 담아보자. 이 때, 열린 괄호가 자기 짝에 맞는 닫힌 괄호를 만나면 stack에서 pop해주려 한다.
그 후, 마지막에 stack에 남은 문자열이 있다면 ( stack.length > 0 ) 그 회전 수는 문자열 내의 모든 괄호가 제대로 짝지어지지 않은 것으로 판단한다. 만약 stack에 남은 문자열이 없다면 ( stack.length === 0 ) 그 회전 수는 올바른 괄호 문자열을 만들었으므로 answer + 1 ( answer++ )을 해준다.
이에 대한 코드는 다음과 같다.
while(p < s.length){
let stack = [s[p]];
for(let i = p + 1; i <= p + s.length - 1; i++){
let index = i >= s.length ? i - s.length : i;
let bracket = s[index], last = stack.at(-1);
if((bracket === "]" && last === "[") || (bracket === "}" && last === "{") || (bracket === ")" && last === "(") ) stack.pop();
else stack.push(bracket);
}
if(stack.length === 0) answer++;
p++;
}
위의 설명대로 stack이란 변수를 선언한다. stack의 초기값은 첫번째 문자를 담고 있다. for문을 돌면서 해당 인덱스의 바로 전 인덱스에 위치한 문자가 해당 인덱스의 문자와 짝이 맞는 괄호인지 확인하기 위해서는 배열에 비교 가능한 문자가 담겨있어야 하기 때문이다.
let stack = [s[p]];
for문을 살펴보자.
bracket: 해당 인덱스의 문자
last: stack에 가장 최근에 담긴 문자
for(let i = p + 1; i <= p + s.length - 1; i++){
let index = i >= s.length ? i - s.length : i;
let bracket = s[index], last = stack.at(-1);
if((bracket === "]" && last === "[") || (bracket === "}" && last === "{") || (bracket === ")" && last === "(") ) stack.pop();
else stack.push(bracket);
}
각 인덱스에 해당하는 문자와 stack의 마지막 문자를 비교해 짝이 맞는 괄호라면 stack에서 마지막 문자를 지우고 ( stack.pop() ) 아니라면 stack에 해당 인덱스의 문자를 추가한다 stack.push(해당 인덱스의 문자).
이제 answer을 반환해주면 끝이다.
return answer;
전체 코드
function solution(s) {
let answer = 0, p = 0;
while(p < s.length){
let stack = [s[p]];
for(let i = p + 1; i <= p + s.length - 1; i++){
let index = i >= s.length ? i - s.length : i;
let bracket = s[index], last = stack.at(-1);
if((bracket === "]" && last === "[") || (bracket === "}" && last === "{") || (bracket === ")" && last === "(") ) stack.pop();
else stack.push(bracket);
}
if(stack.length === 0) answer++;
p++;
}
return answer;
}
'자료구조 & 알고리즘' 카테고리의 다른 글
프로그래머스 [1차] 캐시 - 자바스크립트 코드 (0) | 2025.02.17 |
---|---|
프로그래머스 피로도(완전 탐색) - 자바스크립트 풀이 (0) | 2025.02.09 |
프로그래머스 - 할인 행사 ( 자바스크립트 풀이 ) (0) | 2025.01.11 |
유클리드 호제법 - 최대공약수 구하기 (자바스크립트 코드) (0) | 2025.01.04 |
프로그래머스 영어 끝말잇기 - 자바스크립트 풀이 (0) | 2025.01.01 |