SIU
article thumbnail

#   [2023.02.28] PGS_LV2_42586_기능개발
https://school.programmers.co.kr/learn/courses/30/lessons/42586

<접근법>

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


- 스택과 큐를 활용하는 대표 유형이다.
- 처음에 answer 배열에 현재 진행정도(progresses)에서 speeds와의 수식 관계를 처리하면서 k을 answer에 넣는다.
- (100-num) + speed * k >= 100
- k = Math.ceil((100-num) / (speeds[idx]))  // 소수점 올림 처리 필수 (js)
- 그 후 answer(큐, 스택)에서 하나씩 값을 꺼내면서 첫 배포 시점하고 값을 비교하여 배포 개수를 구한다
- (주의) 처음에는 이전 값하고만 비교하는 줄 았았는데 배포되는 시점하고 (새로운 값을) 비교해야한다.
- [1번 8번 11번만 맞는다면 히든 테케를 이용해보세요]  
- progresses : [93, 30, 55, 60, 40, 65]
- speeds : [1, 30, 5, 10, 60, 7]
- return : [2, 4]

/**
 * 메모리  : 5.57 KB
 * 시간    : 33.7ms
 */
 
 function solution(progresses, speeds) {
    let answer = [];
    progresses.map((num, idx) => {
        //(100-num) + speed * k >= 100 
        k = Math.ceil((100-num) / (speeds[idx]))  // 소수점 올림 처리 필수 (js)
        answer.push(k); // 걸리는 시간 
    })
    let stack = []; // 스택용
    let idx  = 0;  // 인덱스
    let count = []; // 최종 배포 count 
    // stack
    while(answer.length !== 0){ // 위에서 구한 배열이 비어있지 않으면
        let cur = answer.shift(); // peak 꼭대기 값 확인 및 제거가 필수!
        if(stack.length === 0 || stack[0] >= cur){   // ***(중요) stack의 첫 배포 시점하고 새로운 값을 비교!(그 이전 값과 비교x)
         stack.push(cur) // 현재 값 스택에 넣기
        }else { // 현재 값이 이전 값보다 크다면
            count.push(stack.length); // 기존의 스택의 길이만큼 최종 배포 개수 배열에 push  
            stack = []; // 기존 값 전부 출력(초기화)
            stack.push(cur); // 현재 값은 스택에 넣기
        }    
    }
    count.push(stack.length); // 마지막 스택의 길이는 최종 배포 개수 배열에 push
    return count;
}



 

 

profile

SIU

@웹 개발자 SIU

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!