문제 설명
접근 방법
우선 주어진 int형 배열 progresses에 대해 각각의 기능별로 배포하는데 까지 걸리는 시간을 구합니다.
int countOfProgresses = progresses.length;
int[] days = new int[countOfProgresses];
for (int i = 0; i < countOfProgresses; i++) {
days[i] = (int) Math.ceil( ((double) (100 - progresses[i])) / speeds[i] );
}
이후 첫 번째 기능부터 순회하여 다음 기능이 배포되는데 까지 걸리는 시간을 비교합니다. 이때 다음 기능이 첫 번째 기능 보다 개발하는데 걸리는 시간이 같거나 적다면 첫 번째 기능이 배포될 때 다음 기능도 같이 배포되므로 count를 증가시킵니다. 아울러 이미 배포가 되었다면 다음에 순회할 때 중복 처리가 되면 안되므로 별도로 boolean형 배열을 선언하여 방문 처리를 해주도록 했습니다. 반대로 다음 기능이 첫 번째 기능 보다 개발하는데 걸리는 시간이 크다면 이후에 배포 되므로 첫 번째 기능을 기준으로 순회하는 for문에서 break시키고 다음 기능을 기준으로 순회하여 다다음 기능이 배포되는데 까지 걸리는 시간들을 비교합니다.
List<Integer> result = new ArrayList<>();
boolean[] visited = new boolean[countOfProgresses];
for (int i = 0; i < countOfProgresses; i++) {
if (visited[i]) continue;
int target = days[i];
int count = 1;
for (int j = i + 1; j < countOfProgresses; j++) {
if (target >= days[j]) {
count++;
visited[j] = true;
}
else {
break;
}
}
result.add(count);
}
전체 소스 코드
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int countOfProgresses = progresses.length;
int[] days = new int[countOfProgresses];
for (int i = 0; i < countOfProgresses; i++) {
days[i] = (int) Math.ceil( ((double) (100 - progresses[i])) / speeds[i] );
}
List<Integer> result = new ArrayList<>();
boolean[] visited = new boolean[countOfProgresses];
for (int i = 0; i < countOfProgresses; i++) {
if (visited[i]) continue;
int target = days[i];
int count = 1;
for (int j = i + 1; j < countOfProgresses; j++) {
if (target >= days[j]) {
count++;
visited[j] = true;
}
else {
break;
}
}
result.add(count);
}
return result.stream().mapToInt(Integer::intValue).toArray();
}
}
참고자료
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] 카펫 - Java (0) | 2022.05.11 |
---|---|
[프로그래머스] 더 맵게 - Java (0) | 2022.05.10 |
[프로그래머스] 튜플 - Java (0) | 2022.05.08 |
[프로그래머스] 오픈채팅방 - Java (0) | 2022.05.06 |
[프로그래머스] 문자열 압축 - Java (0) | 2022.04.25 |