본문 바로가기
코딩 테스트 문제 및 풀이

[JS] 코딩 테스트 문제 : 올바른 괄호 [스택]

by spare8433 2024. 1. 4.

문제 : 올바른 괄호



문제 설명


괄호가 입력되면 올바른 괄호이면 “YES", 올바르지 않으면 ”NO"를 출력합니다.
(())() 이것은 괄호의 쌍이 올바르게 위치하는 거지만, (()()))은 올바른 괄호가 아니다.


▣ 입력설명

첫 번째 줄에 괄호 문자열이 입력됩니다. 문자열의 최대 길이는 30이다.


▣ 출력설명

첫 번째 줄에 YES, NO를 출력한다.


▣ 입력예제 1

(()(()))(()


▣ 출력예제 1

NO



내코드


function solution(s) {
  let answer = "YES";
  let stack = [];

  // 문자열 길이 만큼 순회
  for (const word of s) {
    // 문자가 ')' 인 경우
    if (word === ")") {
      // stack 에 남은게 없다면 쌍이 맞지 않아 잘못된 경우로 간주
      if (stack.length === 0) return "NO";

      // 스텍에있는 '(' 문자 하나 제거
      stack.pop();
    } else {
      // 문자가 '(' 인 경우 스텍에 추가
      stack.push(word);
    }
  }

  // 마무리된 이후에 stack에 남은 경우가 있다면 쌍이 맞지 않아 잘못된 경우로 간주
  if (stack.length > 0) answer = "NO";

  return answer;
}

let a = "(()(()))(()"; // NO
// let a = "(())()"; // YES
console.log(solution(a));



풀이


  1. 문자가 '(' 인 경우 스텍에 추가
  2. 문자가 ')' 인 경우에 stack 에 남아있는 '(' 문자 하나를 pop 하여 스택에서 제외 만약 stack 남은 ')' 문자가 없다면 쌍이 맞지 않아 잘못된 경우로 간주해 NO 를 리턴
  3. 모든 반복문이 마무리된 경우 stack에 남은 경우가 있다면 쌍이 맞지 않아 잘못된 경우로 간주해 NO 를 리턴
  4. 위 과정들에서 NO 를 리턴한 경우가 아니라면 정상적인 괄호 조합을 의미하로 YES 가 반환됨




참고

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4/dashboard