1. 문제
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.
제한사항
- prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
- prices의 길이는 2 이상 100,000 이하입니다.
입출력 예
prices | answer |
[1, 2, 3, 2, 3] | [4, 3, 1, 1, 0] |
입출력 예 설명
입출력 예 #1
- 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
- 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
- 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
- 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
- 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.
2. 오답
function solution(prices) {
const answer = [];
let temp;
prices.reverse().forEach((price, idx) => {
if (idx === 0) {
temp = [price, idx]
answer.unshift(0);
} else {
if (price < temp[0]) answer.unshift(idx);
else answer.unshift(idx - temp[1]);
temp = [price, idx];
}
})
return answer
}
temp : [최솟값, 최솟값 인덱스]
배열을 뒤에서부터 순회하며 temp를 갱신하고 temp와 비교하는 연산으로 문제를 풀었다.
결과는 처참하다... 테스트 케이스에만 맞는 풀이였다.
3. 정답 풀이
풀이 전략
- 중첩 루프 사용해 각 주식 가격이 떨어지기 전까지 유지된 시간을 계산
function solution(prices) {
const answer = [];
// 마지막 숫자는 연산이 필요 없기 때문에 length-1까지 순회
for (let i=0; i<prices.length-1; i++) {
let temp;
for (let j=i+1; j<prices.length; j++) {
// 주식 가격이 떨어진 경우, 유지한 시간(j-i)을 temp에 할당하고 순회 종료
if (prices[i] > prices[j]) {
temp = j - i;
break
}
}
// 주식 가격이 떨어진 경우(temp !== undefined)는 유지한 시간(temp)을 정답 배열(answer)에 추가
// 주식 가격이 떨어지지 않은 경우(temp === undefined)는 현재 시점부터 종료까지 시간을 정답 배열(answer)에 추가
temp ? answer.push(temp) : answer.push(prices.length-1-i);
}
return [...answer, 0]; // 마지막 시점은 연산 필요 없어 0 추가해 리턴
}
테스트 케이스를 통과하는 것에 너무 신경 쓰기보다는, 문제를 이해하는 데 초점을 맞춰서 문제를 풀어야겠다... 😅
'코딩 테스트 > 프로그래머스(LV2)' 카테고리의 다른 글
[프로그래머스] 스킬트리 (LV2 - JavaScript) (4) | 2024.12.10 |
---|---|
[프로그래머스] 더 맵게 (LV2 - JavaScript) (4) | 2024.12.06 |
[프로그래머스] 땅따먹기 (LV2 - JavaScript) (3) | 2024.12.04 |
[프로그래머스] 뒤에 있는 큰 수 찾기 (LV2 - JavaScript) (3) | 2024.12.01 |
[프로그래머스] k진수에서 소수 개수 구하기 (LV2 - JavaScript) (1) | 2024.11.30 |