주식가격

📔 문제 설명

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.

📓 제약 조건

prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
prices의 길이는 2 이상 100,000 이하입니다.

📓 입출력의 예

prices return
[1, 2, 3, 2, 3] [4, 3, 1, 1, 0]

❗ 1번째

주식가격이 담긴 배열이 오면 이게 떨어질때까지 초를 계산해서 리턴해주는 문제다. ( 이거 이해하는데만 조금 걸렸다.. )

먼저 스택과 리턴해줄 결과 배열이 필요할거같고 스택에는 얼마만큼의 시간만큼 떨어지지않았는지 담아주고 점점 늘어나는 반복문에서 현재 가격과 전번 가격을 비교해서 현재 가격이 전번 가격보다 더 작은 경우는 스택에서 빼서 결과 배열에 맡는칸에 떨어지지않은 시간을 넣어주고 다시 한번 더 현재 가격과 전번 가격을 비교하여 넣어주는 방식을 써야할거같다 그러나 상당히 복잡할거같아 시간이 오래 걸릴거같다

이렇게 반복을하다가 스택에 있는 횟수만큼 반복문 돌려서 빈칸에 역순으로 넣어주면 될거같다(인덱스를 스택에 담고 있다면 남는수만큼 정답배열에 빈칸에 역순으로 넣어주면 됨)

✅ 실행 코드

function solution(prices) {
    const n = prices.length
    const arr = new Array(n).fill(0)
    const stack = []
    
    for(let i = 0; i < n; i++){
        while(stack.length > 0 && prices[stack[stack.length - 1]] > prices[i]){
            const num = stack.pop();
            arr[num] = i - num;
        }
        stack.push(i)
    } 
    
    // 끝까지 가격이 안떨어졌을때
    while (stack.length > 0){
        const num = stack.pop();
        arr[num] = n - num - 1; //전체길이 - 현재인덱스 - 1
    }
    
    return arr
}

📚 문제 느낀점

여기 현재 인덱스 num에서 마지막까지 유지된 시간을 구하는데서 조금 헷갈려서 시간이 걸렸었는데 그래도 정상적으로 문제를 풀 수 있어서 다행인거 같습니다 그리고 배열의 인덱스 값을 저렇게 써본적이 잘 없었는데 뭔가 이렇게 하지않으면 내가 생각한거보다 코드가 길어질거같아 지저분한거 같기도 하다


© 문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/42584