[BOJ] 10799. 쇠막대기

레몬커드요거트·2026년 4월 22일

코딩테스트준비

목록 보기
51/66
post-thumbnail

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

초기아이디어

) 들어왔을 때

  1. 이전의 값이 ) 인 경우 → pop → 레이저가 아님
    • laserCnt + 1
  2. 이전의 값이 ( 인 경우 pop → 레이저임
    • laserCnt ++

( 이후로 닫히기 전까지 몇 개의 레이저가 있는지 세는게 중요한 것 같음

처음 아이디어에서는 쇠막대기 닫히는 기준으로 내부에 몇개의 레이저가 있는지 세는 거였음

최종 아이디어에서는 레이저가 닫히는 기준으로 몇개의 쇠막대기를 넣었는가 갯수 세는 것
→ 몇 개의 쇠막대기가 해당 레이저로 잘리는가?

최종 아이디어

  1. 레이저의 ‘)’의 경우
    • 쇠막대기 넣은 갯수 만큼 잘림
  2. 쇠막대기의 끝 ‘)’의 경우
    - 막대기의 뒷부분 + 1

( 만나면 stack에 무조건 넣기

) 만나면

  1. 직전 값이 ( 인경우 → 레이저 끝
    • POP
    • stack에 남은 ( 갯수가 쇠막대기 갯수
  2. 직전값이 ) 인경우 → 쇠막대기 끝
    • pop
    • 해당 쇠막대기 절단 완료이므로 끝부분만큼 +1

최종코드

const fs = require("fs");
const input = fs
  .readFileSync(process.platform === "linux" ? "/dev/stdin" : "input.txt")
  .toString();

let cutCnt = 0;
let inputArr = input.split("");
let stack = [];

//console.log(inputArr);

for (let i = 0; i < inputArr.length; i++) {
  if (inputArr[i] === "(") {
    stack.push(inputArr[i]);
  } else if (inputArr[i] === ")") {
    stack.pop();
    if (inputArr[i - 1] === "(") {
      // 레이저인 경우
      cutCnt += stack.length;
    } else if (inputArr[i - 1] === ")") {
      // 쇠막대기인 경우
      cutCnt++;
    }
  }
}

console.log(cutCnt);
profile
비요뜨 최고~

0개의 댓글