공부기록/자바스크립트 코딩테스트

[백준/JS] 10799 쇠막대기

_우지 2022. 6. 29. 20:36

 문제링크

 

10799번: 쇠막대기

여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저

www.acmicpc.net

 

문제풀이

설명을 어떻게 해야할지..

이 문제를 왜 스택으로 접근했냐하면, 괄호를 보기만 하면 스택으로 생각하게 되네요.

  • 열린괄호는 쇠 막대기가 들어옴을 의미한다. 그래서 count++ 한다. 그리고 stack에 저장한다.
  • 레이저를 만나면 쇠막대기가 등분된다. 이때 현재 stack의 length가 막대기의 갯수를 의미한다.  예를 들어 3개가 들어있을 경우 레이저를 만난다면 6개로 나누어진다! 그러므로 막대기의 갯수를 += 해주면 된다.
  • 여기서 나는 razerCheck 라는 변수를 선언해서 열린괄호 다음에 닫힌 괄호가 나오는 것을 바로 레이저라고 생각하기로 했다.
  • 또한 지금의 로직은 열린괄호일때 무조건 count+=1 을 해주는데 레이저 일때는 count--를 한다.
const fs = require("fs");

BOJkey = 0;

let input = fs
  .readFileSync(BOJkey ? "./자바스크립트로/10799/input.txt" : "./dev/stdin")
  .toString()
  .trim();

// console.log(input);
let stack = [];
let count = 0;
let razerCheck = true;
for (let i = 0; i < input.length; i++) {
  if (input[i] == "(") {
    stack.push("(");
    razerCheck = true;
    count++;
  } else {
    if (razerCheck) {
      count--;
      count += stack.length - 1;
    }
    stack.pop();
    razerCheck = false;
  }
}

console.log(count);