백준/ Gold 4 문제 , 백준 Node.js 자바스크립트 17928 , 오큰수
✔️Check Point ! ( 해당사항 ✓체크 )
1. 막힘 없이 수월하게 풀린 문제인가?
2. 1시간이내로 풀렸던 문제인가?
3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
4. 시간을 써도 도무지 풀 수 없는 문제인가?
5. 솔루션을 찾아봤는가?
-------------------------------------------------------------------------------------------
난이도 체감 🧑💻
1. 최상
2. 상
3. 중
4. 하
이해도 🙆♂️
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함
덧붙일 말 🏷️
2493 문제 풀이를 응용하여 풀 수 있음. 사실상 거의 같은 문제.
문제 출처 🏠
https://www.acmicpc.net/problem/17298
요구사항 📋
배열이 주어진다.
각, 배열의 값을 기준으로 오른쪽에 있는 자신보다 큰 숫자들 중에서 가장 왼쪽에 있는 값을 새로운 배열에 차례대로 저장.
만약 오른쪽에 자신보다 큰 값이 없다면, -1을 저장.
해결 전략 📝
위 풀이 해결 전략이랑 비슷한 풀이이다.
다른 점이 있다면, 이 문제는 오른쪽 값들을 확인해야 한다.
위 풀이는 왼쪽 값들을 확인하는 풀이이므로 주어진 숫자 배열을 reverse 하여서 푼다.
이후, 마지막 결과 값을 다시 reverse 해서 return 하면 된다.
또한, 초기값이 0 이 아니고 -1 이라는 점.
이 문제에서는 오른쪽에 큰 값이 없으면 -1을 출력해야하기 때문.
기능 목록 📲
1. 초기값이 -1로 이루어진 T 크기의 배열
2. 주어진 배열을 돌면서 store에 저장된 끝값이 비교할 값보다 큰지 작은지 확인.
크다면 오큰수 배열에 그 값을 저장.
작거나 같다면 store 에 저장된 값을 pop 시킴.
예외사항 ⚠️
1 1 1 1 이 주어지면 정답은 -1 -1 -1 -1 이 나와야 한다.
정답 💯
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n")
.map((v) => v.trim().split(" ").map(Number));
const [T, ...nums] = input;
function solution(T, nums) {
nums = nums.reverse();
let [store, idx] = [[], 0];
let answer = Array.from({ length: T }, () => -1);
nums.map((num) => {
while (store.length !== 0) {
if (store.slice(-1)[0][0] > num) {
answer[idx] = store.slice(-1)[0][0];
break;
} else store.pop();
}
store.push([num, idx]);
idx += 1;
});
answer = answer.reverse();
return answer.join(" ");
}
console.log(solution(T[0], nums[0]));
느낀점 🧑💻
이런 스택 문제는 이 풀이로 푸는 것이 가장 깔끔하게 풀리는 것 같다.
반응형
'알고리즘 공부 > 백준 - 자바스크립트' 카테고리의 다른 글
백준/ Gold 3 문제 , 백준 Node.js 자바스크립트 2252 , 줄 세우기 [위상 정렬] (0) | 2022.11.01 |
---|---|
백준/ Silver 3 문제 , 백준 Node.js 자바스크립트 9342 , 염색체 (0) | 2022.10.30 |
백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 1068 , 트리 (0) | 2022.10.27 |
백준/ Silver 1 문제 , 백준 Node.js 자바스크립트 14675 , 단절점과 단절선 (0) | 2022.10.27 |
백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 2493 , 탑 (0) | 2022.10.25 |