• [ 백준_10799 ] 쇠막대기 ( Stack, by using javascript )

    2021. 4. 2.

    by. KimBangg

    문제

    접근법

     

    필자는 큰 조건을 " ( " 인 경우와 ")" 인 경우로 나누었다.

     

    [1] 첫 번째 조건

    "("가 들어 온 경우는, stack 에 이것을 push하여 저장함으로써 몇개의 쇠막대기가 있는지 유추 할 수 있도록 만든다.

     

    [2] 두 번째 조건

    ")" 가 들어 온 경우에는 세부조건을 추가적으로 걸어서 위의 문제를 해결하면 된다.

     

    (2-1)   세부조건 1

     

    ) 이라는 입력 값을 받기 전에 "("가 있는 경우인데, 이를 이해하기 쉽도록 풀어서 설명하자면, 레이저로 잘랐을 때 (= () ) 를 의미한다.

    그리하여 ( 를 pop 하고 이전에 쌓인 ((( 의 개수 즉 길이를 알아내면 레이저로 잘랐을 때 우리가 얻을 수 있는 막대기의 수를 알 수 있다.

     

    이를 통해, () 만 있는 경우는 이전에 들어와있던 값이 없었기에, 레이저만 있다는걸로 유추가 가능하고 결과적으로 카운트가 증가 하지 않음.

     

    (2-2) 세부조건 2

     

    (()) 와 같은 막대기를 레이저로 한번 커팅하면 2개의 막대기가 나온다.

     

    하지만 위의 세부조건을 따르게 되면 (() 일 때, 카운트를 1 올리고 나머지 내용이 모두 없어지기에 )만 남는 현상이 나오는데 이러한 문제를 해결 하기 위한 예외조건으로 설정 해두었다.

     

    코드

    const input = require("fs").readFileSync("/dev/stdin").toString().split("\n");
    const bar = input[0];
    let answer = 0;
    let stack = [];
    
    for (let i = 0; i < bar.length; i++) {
      if (bar[i] === "(") {
        stack.push(bar[i]);
      } else {
        // () 과 같이 된 경우에는 자를 철근이 없다는 것을 의미한다.
        // 그리하여 ) 인 상태에서 자신의 전에 (가 있었어도 stack은 비어있기에 0이 증가한다.
        if (bar[i - 1] === "(") {
          stack.pop();
          answer += stack.length;
        } else {
          stack.pop();
          answer += 1;
        }
      }
    }
    
    console.log(answer);
    

    문제를 풀면서 배우고 느낀 점

    이전에 문자열을 검사 하는 방법 중에, ( a of string) 이라는 방법을 알아냈다.

    그리하여, 본 문제에서도 그러한 루프를 적용 하려고 했는데,  i 일 때 i-1인 경우를 체크 하는 경우에서는 사용하기가 어렵다는 점을 알 수 있었다.

     

    댓글