✏️ 문제

4개의 기호 ( ) [ ] 를 이용해서 만들어지는 괄호열로, 아래 규칙으로 계산하는 프로그램을 작성하시오.

예를 들어 ()[[]]는 2 + 3 3 = 11이 나오며, ([])의 값은 2 3으로 6이다.
만약 쌍이 맞지 않거나 기호 순서가 비정상적이라 올바른 괄호 셋이 만들어지지 않는 경우에는 0을 반환한다.
입력값

(()[[]])
[][]((])
(()[[]])([])

📝 풀이

// prototype 생성
if (!Array.prototype.peek) {
  Array.prototype.peek = function () {
    return this[this.length - 1];
  };
}

if (!Array.prototype.isEmpty) {
  Array.prototype.isEmpty = function () {
    return this.length == 0;
  };
}

function answer(str) {
  let result = 0;

  let stack = [];
  let temp = 1;
  for (let i = 0; i < str.length; i++) {
    let mark = str[i];

    switch (mark) {
      case "(":
        temp *= 2;
        stack.push(mark);
        break;
      case "[":
        temp *= 3;
        stack.push(mark);
        break;
      case ")":
        if (stack.isEmpty() || stack.peek() != "(") {
          return 0;
        }

        if (str[i - 1] == "(") {
          result += temp;
        }

        stack.pop();
        temp /= 2;
        break;
      case "]":
        if (stack.isEmpty() || stack.peek() != "[") {
          return 0;
        }

        if (str[i - 1] == "[") {
          result += temp;
        }

        stack.pop();
        temp /= 3;
        break;
    }
  }

  // 한 쌍이 아닐 경우
  if (!stack.isEmpty()) {
    return 0;
  }

  return result;
}
  1. ( = 2, [ = 3, ) = / 2, ] = /3
  2. () or [] 은 현재 temp값을 result에 더해준다.
  3. 임시 변수 temp를 만들어준다.
  4. for문을 통해 str.length만큼 순회하며, 탐색할 수 있게 작성해준다. (let mark = str[i])
  5. switch문을 통해 만약 mark가 ( 이 문자일 경우 2 를 하여 temp에 저장해주고 stack에 push한다.
    [ 일 경우
    3으로 작성하고, 한 쌍이 아닐 경우 0을 리턴해주도록 작성한다.
  6. 인접해 있는지 판단하기 위한 코드를 if문으로 작성해준다.
profile
#UXUI #코린이

0개의 댓글