문제 링크
https://www.acmicpc.net/problem/12789
답안
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "text.txt";
const newLine = process.platform === "linux" ? "\n" : "\r\n";
let [max, line] = fs.readFileSync(filePath).toString().trim().split(newLine);
line = line.split(" ").map((n) => +n);
function solution(line) {
let count = 1;
const unorderedLine = line.reverse();
const waitLine = [];
while (unorderedLine.length > 0) {
if (waitLine.at(-1) === count) {
waitLine.pop();
count++;
continue;
}
const person = unorderedLine.pop();
if (person === count) {
count++;
continue;
} else {
waitLine.push(person);
}
}
while (waitLine.length > 0 && waitLine.at(-1) === count) {
count++;
waitLine.pop();
}
return waitLine.length > 0 ? "Sad" : "Nice";
}
console.log(solution(line));
- 정렬되지 않은 스택과 대기열 스택을 이용해서 스택 내 엘리먼트를 순서대로 정렬할 수 있는지를 묻는 문제이다.
- 정렬되지 않은 스택은 unorderedLine으로, 대기열 스택은 waitLine으로 명명한다.
- 스택의 최상단 데이터만 스택을 탈출할 수 있다.
- 첫번째 반복문은 unorderedLine의 모든 스택을 비울 목적으로 로직을 작성한다.
- unorderedLine의 최상단 데이터가 count와 같을 경우, 데이터를 pop하고 count를 1 증가시킨다.
같지 않을 경우, 데이터를 대기열(waitLine)으로 옮긴다. - 첫번째 반복문이 돌 때도 waitLine의 최상단 데이터가 count와 일치할 수 있으므로, 이 상황도 고려해서 waitLine의 데이터도 count와 비교해서 pop할 수 있다면 pop을 해야 한다.
- 첫번째 반복문을 통해 unorderedLine의 데이터는 waitLine으로 옮겨지거나, count와 일치하여 pop되면서 최종적으로 스택의 데이터는 모두 비게될 것이다.
- 두번째 반복문은 waitLine 내부의 데이터를 처리하는 반복문으로, waitLine이 비어있지 않거나, waitLine의 최상단 데이터가 count와 같을 때 count를 1 증가시키고, waitLine의 데이터를 pop한다.\
- waitLine에서 순서대로 정렬되어 있지 않다면, 더이상 스택을 정렬할 방법이 없으므로 Sad가 출력된다.
- waitLine을 모두 pop하여 waitLine 스택이 모두 비게되면 스택을 정렬할 수 있으므로 Nice가 출력된다.
'코테 문제 풀이' 카테고리의 다른 글
[Node.js] 구름톤 챌린지 1주 Day5 풀이 (0) | 2023.08.18 |
---|---|
[Node.js] 구름톤 챌린지 1주 Day3 풀이 (0) | 2023.08.16 |
[Node.js] 구름톤 챌린지 1주 Day2 풀이 (0) | 2023.08.15 |
[백준 1074] Z (Node.js) - 분할정복 (0) | 2023.05.30 |
[백준 4779] 칸토어 집합 (Node.js) - 분할정복 (0) | 2023.05.30 |