쇠막대기

minho·2022년 3월 2일
0

문제


문제이해

  • "()" 가나오면 쇠막대기를 반으로 나눈다.
  • ((())) ()를 제외한 나머지 괄호는 쇠막대기를 뜻한다. 여기서는 쇠막대기가 두개다.
  • ()앞에 "("의 수만큼 막대기의 갯수가 늘어난다.
    ((()))에서는 두개의 막대기가 갈라지므로 ()앞으로는 2개의 막대기가 생긴다.
  • ()뒤의 ")" 막대기는 1개의 막대기를 생기게 한다.
  • (((()())에서 마지막 ")"는 ()위 뒤에 있으므로 1개의 막대가 생긴다.

문제해결전략

loop 로 input을 입력받는다.
   만약 "("가 나오면 stack에 넣는다. status = true만든다.
   만약 ")"가 나오면...
     status = true이면 ()이므로 stack의 length만큼 answer에 더해준다.
        stack.pop()을 해준다.
     status = false라면 answer에 1을 더해준다.
     위의 두 사항을 마치면 status는 false로 한다.

CODE

let input = "(((()(()()))(())()))(()())";

let sta;
let answer = 0;
let stack = [];
for (let i of input) {
  if (i === "(") {
    stack.push(i);
    sta = true;
  } else {
    if (sta) {
      stack.pop();
      answer += stack.length;
    } else {
      stack.pop();
      answer++;
    }
    sta = false;
  }
}
console.log(answer);

문제점

  • i이전에 나오는 요소가 "("인지 ")"인지 알아보기위해 sta를 사용
    -> 시인성이 좋지 않다.

Refactoring

let input = "(((()(()()))(())()))(()())";
let answer = 0;
let stack = [];
for (let i = 0; i < input.length; i++) {
  let val = input[i];
  if (val === "(") stack.push(val);
  else {
    if (input[i - 1] === "(") { //input[i-1]을 통해 var앞에 무엇이 오는지 확인할 수 있다.
      stack.pop();
      answer += stack.length;
    } else {
      stack.pop();
      answer += 1;
    }
  }
}
console.log(answer);
  • input[i-1]을 통해서 val앞에 무엇이 나오는지 알아볼 수 있으며 시인성이 높아졌다.
profile
Live the way you think

0개의 댓글