백준 17608 막대기 | JavaScript 스택

예짱구·2025년 9월 2일

알고리즘

목록 보기
9/16

https://www.acmicpc.net/problem/17608



오른쪽에서 바라봤을 때 총 몇개의 막대기가 보일 수 있는지 세어야하는 문제.

스택에 값을 차례대로 넣으면서 이전에 넣은 값이 새로 넣는 값보다 작은 경우에 pop하면 쉽게 풀릴 것 같았다.
처음에는 count 값을 배열의 길이로 초기화하고, pop할 때마다 count값을 감소시키면서 세어나가려 했는데, 무엇이 문제인지 잘 되지 않았다.😥

그래서 다시 생각을 해 봤는데, (스택 기준) 현재값과 이전값을 비교하여 이전값이 작은 경우 pop하여 값을 제거하면 마지막에 완성된 스택은 중복값이 제거되고, 내림차순으로 정렬되어 있을 것이다.
따로 count 변수를 두지 않고, 완성된 스택의 길이를 반환하면 볼 수 있는 막대기의 수가 된다!!

또 문제가 하나 있었는데, pop을 하는 조건을 확인하기 전에 값을 push해서 이전값이 아니라 현재값이 pop되는 문제가 있었다. 테스트 케이스로 계속 디버깅을 하다가 순서가 잘못된 걸 알았다 . . pop을 하든 하지않든 항상 push되어야하며, pop을 하는 경우에는 pop -> push 순서로 진행되어야 한다.

문제 자체가 그렇게 어렵지는 않았던 듯 !

전체 코드

const stack = [];

function solution(bars) {
  for (let i = 0; i < bars.length; i++) {
    while (bars[i] >= stack[stack.length - 1]) {
      stack.pop();
    }
    stack.push(bars[i]);
  }

  return stack.length;
}

// =====입출력=====

const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = [];

rl.on("line", (line) => {
  if (input.length === 0) {
    input.push(Number(line));
  } else {
    input.push(Number(line));
  }

  if (input.length === input[0] + 1) {
    rl.close();
  }
}).on("close", () => {
  const bars = input.slice(1);

  console.log(solution(bars));
});

profile
IF YOU WANNA CHANGE, BE NOT AFRAID💥

0개의 댓글