초 단위로 기록된 주식 가격이 담긴 배열 prices
가 주어질 때, 각 가격이 떨어지지 않은 기간은 몇 초인지를 구하는 함수를 작성하는 문제입니다.
prices
의 각 가격은 1 이상 10,000 이하인 자연수입니다.prices
의 길이는 2 이상 100,000 이하입니다.[1, 2, 3, 2, 3]
[4, 3, 1, 1, 0]
1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
3초 시점의 ₩3은 1초 뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.
function solution(prices) {
const answer = [];
const n = prices.length;
for (let i = 0; i < n; i++) {
let duration = 0;
for (let j = i + 1; j < n; j++) {
duration++;
if (prices[i] > prices[j]) {
break;
}
}
answer.push(duration);
}
return answer;
}
console.log(solution([1, 2, 3, 2, 3])); // [4, 3, 1, 1, 0]
이 코드는 주어진 예시 입력에 대해 올바른 결과를 출력합니다. 모든 가격에 대해 가격이 떨어지지 않은 기간을 정확히 계산할 수 있습니다.
prices
배열의 길이를 n
에 저장합니다.prices
배열을 순회하면서 각 가격이 떨어지지 않은 기간을 계산하여 answer
배열에 저장합니다.duration
을 증가시키며 반복합니다.break
로 루프를 종료하고, duration
값을 answer
배열에 추가합니다.answer
배열을 반환합니다.이 문제는 스택을 사용하여 더 효율적으로 해결할 수 있습니다. 스택을 사용하면 이중 for 루프를 사용하는 것보다 시간 복잡도를 O(n)으로 줄일 수 있습니다.
function solution(prices) {
const answer = Array(prices.length).fill(0);
const stack = [];
for (let i = 0; i < prices.length; i++) {
while (stack.length && prices[stack[stack.length - 1]] > prices[i]) {
const j = stack.pop();
answer[j] = i - j;
}
stack.push(i);
}
while (stack.length) {
const j = stack.pop();
answer[j] = prices.length - 1 - j;
}
return answer;
}
console.log(solution([1, 2, 3, 2, 3])); // [4, 3, 1, 1, 0]
prices
배열의 길이가 최대값인 100,000에 가까울 때 중요합니다.결론적으로, 스택을 사용한 방법은 더 효율적이며, 특히 큰 입력 데이터에서 성능상의 이점을 제공합니다. 코딩 테스트나 실제 애플리케이션에서 성능이 중요한 경우 스택을 활용한 방법을 추천합니다.