낭 만 당

프로그래머스 Lv 2 - 기능개발 (JavaScript) 본문

Programming Record

프로그래머스 Lv 2 - 기능개발 (JavaScript)

낭만알파카 2025. 8. 15. 14:32

코딩테스트 pccp를 신청했다..!!

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

자료구조 관련된 문제를  공부해야 할 것 같다고 계속 느끼는 중이라...

스택/큐 카테고리, 정답률 66%의 문제에 도전합니다...

스택/큐 Lv. 2 73,009명 66%

 

 

문제 해결 로직

  1. '완료까지 남은 날짜' 계산하기: 각 기능이 100%가 되려면 며칠이 걸리는지 계산해서 새로운 배열에 저장합니다.
    • 남은 진도 = 100 - 현재 진도
    • 걸리는 날짜 = 남은 진도 / 개발 속도 (나누어 떨어지지 않으면 올림 처리)
  2. 배포 그룹 묶기: '남은 날짜' 배열을 순회하며 배포 단위를 결정합니다.
    • 첫 번째 기능이 배포될 때까지 걸리는 날짜를 '기준일'로 설정합니다.
    • 뒤이은 기능들의 '남은 날짜'가 '기준일'보다 작거나 같으면, 같은 날 배포될 수 있으므로 하나의 그룹으로 묶습니다.
    • 만약 '기준일'보다 오래 걸리는 기능이 나타나면, 거기서 그룹을 끊고 그 기능의 '남은 날짜'를 새로운 '기준일'로 설정합니다.
  3. 결과 반환: 각 그룹에 속한 기능의 개수를 answer 배열에 담아 반환합니다.
function solution(progresses, speeds) {
    const answer = [];
    const daysLeft = progresses.map((progress, index) => {
        const speed = speeds[index];
        const remaining = 100 - progress;
        return Math.ceil(remaining / speed); 
        //이 문제에서는 "하루의 끝에 배포"한다는 조건 때문에, 
        //1.1일이 걸려도 2일, 7.0일이 걸려도 7일로 계산해야 해서 Math.ceil()이 꼭 필요
    });
    let deployCount = 0; 
    let maxDay = daysLeft[0]; 
    for (let i = 0; i < daysLeft.length; i++) {
        if (daysLeft[i] > maxDay) {
            answer.push(deployCount);
            maxDay = daysLeft[i];
            deployCount = 1;
        } else {
            deployCount++;
        }
    }
    answer.push(deployCount);

    return answer;
}