문제 설명
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.
실은 문제를 이해하는데 시간이 좀 걸렸습니다. 하하
prices
에 초 단위로 각 시점의 주식가격이 배열로 주어집니다.
각 시점의 주식가격이 떨어지기 전까지의 기간은 몇 초인지 구하는 문제입니다.
입출력 예가 1개밖에 없어서 여러 예시가 추가되었으면 하는 바람입니다.
아직도 지문이 이해되지 않는다면, 해당 링크를 참고해주세요.
처음에는 각 시점의 주식가격을 기준으로 이후 시점 중 주식가격이 떨어지지 않은 시점을 모두 계산하는 문제라고 생각하고 풀었더니 실패가 떴습니다.
주식가격이 처음 떨어진 시점까지만 확인하면 됩니다!
function solution(prices) {
const answer = prices.reduce((acc, cur, index, origin) => {
// 현재 시점 이후의 prices
const rest = origin.slice(index + 1);
// 현재 시점부터 마지막 시점까지의 총 기간(초)
const duration = rest.length;
// 가격이 떨어진 각 시점(초) 계산
const fallInPriceDuration = rest.filter(price => price < cur).length;
// 총 기간에서 가격이 떨어진 기간을 저장
acc.push(duration - fallInPriceDuration);
return acc;
}, []);
return answer;
}
예시 문제는 통과해서 더 당혹스러웠습니다.
아무튼 위의 풀이는 문제를 잘못 이해하고 짠 코드입니다.
function solution(prices) {
const pricesLength = prices.length;
// 1초 뒤 가격이 떨어져도 1초간 가격은 떨어지지 않은 것으로 간주하므로 배열을 1초로 초기화
// 단, 마지막 시점의 경우 0초로 초기화
let answer = Array.from({ length: pricesLength }, (_, index) => index === pricesLength - 1 ? 0 : 1);
// 마지막 시점은 항상 0초이므로 prices의 마지막 시점을 제외하고 순회
for (let i = 0; i < pricesLength - 1; i++) {
for (let j = i + 1; j < pricesLength - 1; j++) {
// 현재 시점(i)의 가격보다 주식가격이 떨어진 경우 반복문 탈출
if (prices[i] > prices[j]) break;
// 가격이 떨어지지 않은 기간 1초씩 증가
answer[i] += 1;
}
}
return answer;
}
특정 시점의 1초 뒤 가격이 떨어져도 1초간 가격이 떨어지지 않은 것으로 봅니다.
따라서 answer
를 처음부터 모두 1초간 가격을 유지하는 것을 전제로 초기화를 했습니다.
단, 마지막 시점은 0초로 초기화 했습니다.
prices
를 순회할 때 마지막 시점은 항상 0초이기 때문에 마지막 요소를 제외하여 불필요한 순회를 줄였습니다.
참고