https://school.programmers.co.kr/learn/courses/30/lessons/42584
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 설명
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.
제한사항
- prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
- prices의 길이는 2 이상 100,000 이하입니다.
입출력 예
| prices | return |
| [1, 2, 3, 4, 5] | [4, 3, 1, 1, 0] |
입출력 예 설명
- 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
- 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
- 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
- 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
- 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.
처음 JS로 알고리즘 문제를 풀어보는거라 기본적인 레벨2를 선택해보았다.
`스택/큐` 범주에 들어있는 문제인데, 처음엔 그냥 무식하게 풀어보니 정답이다...?
function solution(prices) {
var answer = [];
for(let i = 0; i < prices.length; i++) {
let sum = 0;
for(let j = i + 1; j < prices.length; j++) {
sum++;
if(prices[i] > prices[j]) break;
}
answer.push(sum);
}
return answer;
}
다시.. 정신차리고 스택으로 풀어보려고 노력해보자
function solution(prices) {
const answer = [];
const stack = [];
for(let i = 0; i < prices.length; i++) {
while(stack.length && prices[stack[stack.length - 1]] > prices[i]) {
const top = stack.pop();
answer[top] = i - top;
}
stack.push(i);
}
while(stack.length) {
const top = stack.pop();
answer[top] = prices.length - 1 - top;
}
return answer;
}
- 스택에는 아직 처리되지 않은 인덱스를 저장
- 새로운 가격이 들어올 때마다, 스택에 있는 이전 가격과 비교
- 가격이 떨어졌으면 해당 시점의 기간을 계산하고 스택에서 제거
- 반복
시간복잡도 비교
크게 달라보이지 않긴 하지만, 확실하게 스택으로 만들었을 땐 O(n)의 시간복잡도를 가지며, 이중반복문은 O(n^2)의 시간복잡도를 가질 것이다!
'Algorithm' 카테고리의 다른 글
| 백준 1916 최소비용구하기(C++) (0) | 2025.05.18 |
|---|---|
| 백준 20551번 Sort 마스터 배지훈의 후계자(C++) (2) | 2025.05.04 |
| 백준 12847번 꿀 아르바이트 (C++) (0) | 2025.04.13 |
| 백준 20057번 마법사 상어와 토네이도 (C++) (0) | 2025.04.04 |
| 백준 1915번 가장 큰 정사각형 (C++) (0) | 2025.03.26 |