
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));
});
