제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
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[] 배열로 반환합니다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[코딩테스트] Java 프로세스 (1) | 2024.11.09 |
---|---|
[코딩테스트] Java 올바른 괄호 (0) | 2024.11.09 |
[코딩테스트] Java 같은 숫자는 싫어 (0) | 2024.11.09 |
[코딩테스트] Java 베스트 앨범 (4) | 2024.11.08 |
[코딩테스트] Java 의상 (0) | 2024.11.08 |