Algorithm 10장 - 괄호쌍 구하기
포스트
취소

Algorithm 10장 - 괄호쌍 구하기

Algorithm

유효한 괄호쌍

문제

  • 입력된 괄호 값들이 모두 쌍이 맞게 올바른지를 판단해 모두 쌍이 맞으면 true 그렇지 않으면 false를 출력하세요.

  • 입력된 괄호 값들이 유효한 경우들은 다음에 해당합니다.

  1. 열린 괄호는 같은 타입의 닫힌 괄호로 닫혀있어야 한다.
  2. 열린 괄호는 올바른 순서대로 닫혀야만 한다.
  3. 모든 닫힌 괄호는 그에 상응하는 같은 타입의 열린 괄호를 갖고 있다.
  • 입력값을 통해 들어오는 괄호는 (),[],{}로만 이루어져 있습니다.

입력

  • 인자 1 : str
    • string 타입으로 된 문장

출력

  • boolean 타입을 리턴해야 합니다.

주의 사항

  • 입력값을 통해 들어오는 괄호는 (),[],{}로만 이루어져 있습니다.
  • 입력값으로 들어오는 str의 길이는 0부터 10^4승 까지 입니다.

입출력 예시

1
2
3
4
5
6
7
8
9
10
11
const result1 = isValid("[]");
console.log(result1); // true

const result2 = isValid("[)");
console.log(result2); // false

const result3 = isValid("[]{}()");
console.log(result3); // true

const result4 = isValid("[]{)()");
console.log(result4); // false

힌트

  • 스택을 사용해 보세요.
  • 열린 괄호인 경우 스택에 push합니다.
  • 닫힌 괄호인 경우에는 스택의 top을 확인하고, 해당 닫힌 괄호와 짝이 맞는 열린 괄호인지를 확인합니다.

코드

1
const isValid = (str) => {};

코드 설명

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
const isValid = (str) => {
  if (str.length === 0) return false;
  let stack = [];
  // str을 비교해서 stack에 넣는다.

  // 쌍을 정해 줄 예시를 작성한다.
  let sign = {
    "(": ")",
    "[": "]",
    "{": "}",
  };

  // str을 나눈다.
  let word = str.split("");

  for (let i = 0; i < word.length; i++) {
    if (word[i] === "(" || word[i] === "[" || word[i] === "{") {
      stack.push(word[i]);
    } // 열린 괄호인 경우 stack에 넣는다.
    else {
      // 닫힌 괄호인 경우는 스택의 마지막 값을 확인해서, 짝이 맞는 열린 괄호인지를 확인한다.
      let save = stack.pop();
      if (word[i] !== sign[save]) return false;
      // word[i]는 닫힌 괄호, sign[stack에 들어가 있는 마지막 열린괄호]
    }
  }
  if (stack.length !== 0) return false; // pop해서 사라져야 하는데 값이 남아있다는 건 짝이 안 맞는다.
  return true;
};

코드 설명

  • if(str.length === 0) return false
    • 아무런 괄호쌍을 입력하지 않으면 false를 출력한다.
  • let stack = []
    • stack 역할을 할 빈 배열을 작성한다.
  • let sign = {...}
    • 입력한 열린 괄호에 따라 닫힌 괄호를 작성할 짝을 만들어 놓는다.
  • let word = str.split('')
    • 입력받은 괄호쌍을 하나씩 나눈다.
  • for(...){...}
    • if(word[i] === "("||word[i] === "["||word[i] === "{")
      • 입력받은 인자가 열린 괄호일 시,
    • stack.push(word[i])
      • stack에 열린 괄호를 넣어놓는다.
    • let save = stack.pop
      • 만약 닫힌 괄호일 경우 else문으로 오게 되고, 현재 stack에 들어있는 열린 괄호와 짝을 비교하기 위해 stack에 마지막으로 입력되어 있는 열린 괄호를 저장해놓는다.
    • if(word[i] !== sign[save]) return false
      • 미리 작성해 놓았던 괄호 짝을 가진 객체인 sign에 방금 저장한 열린 괄호를 비교하여, 열린 괄호의 짝과 닫힌 괄호가 일치하지 않는다면 잘못된 짝이라는 말이기 때문에 false를 출력한다.
    • if(stack.length !== 0) return false
      • 모든 순서를 거쳐 짝을 확인했는데도 stack에 값이 남아있다는 것은 열린 괄호가 짝 없이 하나만 입력됐다는 뜻이기 때문에 false를 출력한다.
    • return true
      • 모든 조건문을 다 거쳤을 경우 true를 리턴한다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.