제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
Programmers 알고리즘 고득점 Kit입니다.

포인트

선행 작업이 끝나야 뒤에 작업을 배포할 수 있습니다. 따라서 이전 기능 개발이 끝나는 날을 기록하여 해당 기간까지 다음 기능개발을 끝내는 수 있는지 확인하여 분기처리를 진행합니다.

소스코드

import java.util.*;

class Solution {
    
    public int[] solution(int[] progresses, int[] speeds) {
        List<Integer> production = new ArrayList<>();
        
        int len = progresses.length;
        int curDay = 0;
        int features = 0;
        
        for (int i = 0; i < len; i++) {
            // 남은 작업일 계산
            int remainDay = (100 - progresses[i]) / speeds[i];
            if ((100 - progresses[i]) % speeds[i] != 0) {
                remainDay++;
            }
            
            // 현재 기능이 배포 가능일보다 오래 걸리면 새로운 배포
            if (curDay < remainDay) {
                if (features > 0) {
                    production.add(features); // 이전에 쌓인 기능 수를 추가
                }
                curDay = remainDay; // 현재 배포 일자 갱신
                features = 1; // 새 기능 초기화
            } else {
                // 현재 기능이 이전 배포 일자 내에 완성되면 함께 배포
                features++;
            }
        }
        
        // 마지막에 남은 기능 수 추가
        if (features > 0) {
            production.add(features);
        }
        
        // 결과 배열로 변환
        return production.stream().mapToInt(Integer::intValue).toArray();
    }
}

코드 설명

  • remainDay = 현재 기능을 완료하기까지 걸리는 일 수.
    curDay = 지난 일자
    features = 배포 기능 개수
  • int remainDay = (100 - progresses[i]) / speeds[i];
    • 남은 작업 일을 계산합니다. 나누어 떨어지지 않는다면 하루가 더 필요합니다.
// 현재 기능이 배포 가능일보다 오래 걸리면 새로운 배포
if (curDay < remainDay) {
    if (features > 0) {
        production.add(features); // 이전에 쌓인 기능 수를 추가
    }
    curDay = remainDay; // 현재 배포 일자 갱신
    features = 1; // 새 기능 초기화
} else {
    // 현재 기능이 이전 배포 일자 내에 완성되면 함께 배포
    features++;
}

// 마지막에 남은 기능 수 추가
if (features > 0) {
    production.add(features);
}
  • 지금까지 걸린 기간에서 남은 일보다 작으면 현재 기능을 배포할 수 없습니다. 
    따라서 현재 기간까지 배포 가능한 기능 수(features)를 add해주고
    현재 배포 일자와 새 기능 수를 갱신합니다.
  • 반대로 걸린 기간이 남은 일자보다 더 크면 배포 기능 수를 추가해줍니다.
  • 이후 마지막에 남은 기능 수를 추가해줍니다.
  • return production.stream().mapToInt(Integer::intValue).toArray();
    • 결과를 int[] 배열로 반환합니다.

+ Recent posts