본문 바로가기

프로그래머스

5/18[문제풀이] 프로그래머스 Lv2 괄호 회전하기

출처 : https://programmers.co.kr/learn/courses/30/lessons/76502

 

문제풀이

 

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
29
function solution(s) {
  s = s.split("");
  let Len = s.length - 1;
  let answer = 0;
 
  for(let x=0; x<Len; x++) {
    const stack = [];
    for (let y = 0; y < s.length; y++) {
      stack.push(s[y]);
      if (
        (stack[stack.length - 2=== "(" 
        && stack[stack.length - 1=== ")"||
        (stack[stack.length - 2=== "{" 
        && stack[stack.length - 1=== "}"||
        (stack[stack.length - 2=== "[" 
        && stack[stack.length - 1=== "]")
      ) {
        stack.pop();
        stack.pop();
      }
    }
    if (stack.length === 0) answer++;
    
    let temp = s.shift()
    s.push(temp)
  }
  
  return answer;
}
cs

 

처음에 이 문제를 풀기하기 위해 일일이 for문, shift와 push를 반복을 진행하려고 했다가 잘못 구성해서 그런지는 몰라도 효율성에서 오류가 나는 바람에 한동안 생각하다가 고안한 로직이다.

for문 두 개를 사용해서 바깥 for 문은 기존 s 입력 값을 회전하는 반복문으로 사용하고 안 쪽 바깥 for 문은 문제에서 가장 중요한 회전한 s가 올바른 괄호인지 검증하는 것을 stack을 사용해 나타냈고 이 stack이 비었으면 올바른 괄호이고 그러한 상황일 때마다 answer를 더해 주는 식으로 로직을 구성했다.

그리고 24~25번째 코드 끝마무리를 잊어먹고 있다가 한참 후에 추가하니 올바르게 작동 되었다.

알고리즘 문제 중에서 stack이라는 개념이 정말 어디에 빠질래야 빠질 수 없는 존재임을 한 번 더 느낀 것 같다.