[JavaScript] 백준 10799 쇠막대기

SanE·2024년 2월 5일

Algorithm

목록 보기
38/127

쇠막대기

📚 문제 설명


문제에 대한 자세한 설명은 상단에 있는 문제 링크로 직접 보도록 하고 간략하게 문제를 설명하겠다.

  • ()는 레이저이다.
  • 레이저가 아닌 ( 표시는 쇠막대기 시작 지점, ) 는 쇠막대기 끝 지점이다.
  • () 레이저로 쇠막대기가 잘린다고 했을 때, 잘려진 조각의 갯수는 모두 몇개인가.

예시

()(((()())(())()))(())

잘린 조각의 갯수 : 17

👨🏻‍💻 풀이 과정


  • stack 에 쇠막대기를 저장
  • ) 를 보고 레이저인지 확인하기 위해 isLaser 변수를 사용
    • 직전에 ( 였을 경우 레이저라고 판단
    • 레이저가 아닐 경우 쇠막대가 끝나는 지점
  • 레이저로 자를 때, stack 에 있는 쇠막대 갯수 만큼 조각 생성

전체 풀이

    let fs = require("fs");
    let input = fs.readFileSync("/dev/stdin").toString().trim().split("");

    let stack = [];
    let isLaser = false;
    let answer = 0;

    for (let i = 0; i < input.length; i++) {
        if (input[i] === '(') {
            stack.push('(');
            isLaser = true;
        } else { 
          // 직전 값이 '(' 라면
            if (isLaser) {
                stack.pop();
                answer += stack.length;
                isLaser = false;
          // 직전 값이 ')' 라면
            } else {
                stack.pop();
                answer += 1;
            }
        }
    }
    console.log(answer);

🧐 후기


스택을 활용한 문제였고, 직전 값을 따로 반복문 안에서 i + 1 이런식으로 계산하기 싫어서 isLaser 라는 변수를 사용했다.

그런데 제출을 했는데 체점을 하는 시간이 굉장히 오래 걸려서 혹시 틀렸나 조마조마하며 지켜지만, 결국 맞았다고 떠서 다행이었다.

체점을 완료하고 체점 현황을 node.js로 두고 확인하며 나의 풀이가 따로 코드 줄이 너무 길거나 시간, 메모리를 더 많이 쓰는 것은 아닌거까지 확인하고 나서야 안심했다.

profile
JavaScript를 사용하는 모두를 위해...

0개의 댓글