[Programmers Lv.2 | JS] 주식가격

Bori·2023년 9월 7일
0

Algorithm

목록 보기
23/26
post-thumbnail

프로그래머스 주식가격 문제 링크

문제 설명

문제 설명
초 단위로 기록된 주식가격이 담긴 배열 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초이기 때문에 마지막 요소를 제외하여 불필요한 순회를 줄였습니다.

마무리

  • 해당 문제는 스택/큐로 분류되어 있는데, 스택을 이용하지 않아도 풀 수 있어서 문제가 한 번 더 정리되면 좋겠다는 생각이 듭니다.

참고

0개의 댓글