본문 바로가기
코딩테스트 연습/Stack

[Programmers] 괄호 회전하기

by eddypark 2024. 10. 9.

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