문제
해결 방안 고민
== 기능개발 ==
진도가 100% 일 때 서비스에 반영
=== 각 기능의 개발속도가 모두 다름 ===
- 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있음
- 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됨
- 뒤에 있는 기능은 앞에 있는 기능의 개발이 끝날 때까지 기다려야 함
=== 조건 ===
먼저 배포되어야 하는 순서대로 작업 진도가 적힌 정수 배열 progresses
각 작업의 개발 속도가 적힌 정수 배열 speeds
각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수 작성
=======================
progresses.length = speeds.length
progresses[i] += speeds[i];
100이 되었는데 순서가 맨 앞이 아닌 2번째 혹은 3번째 - 대기
- 100이 된 수들은 speeds[i]를 더하면 안 됨!!
- 100이 된 수가 아닌 100보다 크거나 같은 수를 제거해버리면 됨
기준: 맨 앞의 수
Markdown
복사
•
문제는 이해를 했는데 코드 구현이 쉽지 않아서 어려웠던 문제였다.
해결 방법
•
배열을 사용하는 방법과 Queue를 사용하는 방법이 있는데 두 가지 방법이 있다.
◦
배열
▪
범위가 100까지 이므로 길이를 100으로 하는 배열을 생성한다.
◦
Queue
▪
속도는 빠르지만 순서가 뒤에 있는 경우에는 앞의 작업이 끝나는 시점으로 간주하여 앞의 작업이 끝나는 일수로 계산
▪
맨 앞의 일수를 기준으로 기능이 배포되는 프로세스의 개수를 리턴하도록 처리해야 함
•
속도가 30인 경우 30 * 4 = 120 > 100 (100을 초과해버리는 경우, 100으로 간주하여 완성되었다고 하는 로직 필요 => if (value > 100))
코드
•
배열
package algo250311;
// 기능개발 - Lv2, Queue 사용 X
import java.util.Arrays;
public class Pro42586 {
public int[] solution(int[] progresses, int[] speeds) {
int[] temp = new int[100]; // 작업의 개수는 100개 이하여서 100으로 선언
int day = 0; // temp에 적용할 배포일
// 각 항목마다 100까지 검사해야 하기에 for문 안에 while문 작성
int length = progresses.length;
for (int i = 0; i < length; i++) {
while (progresses[i] + (speeds[i] * day) < 100) {
day++;
}
temp[day]++; // 다음 기능 개발 일수도 증가
}
int count = 0;
// temp에 들어간 배열의 길이를 알기위한 코드
// temp는 초기에 0으로 선언되어 있으므로 0이 아닌 값만 측정하면 됨
for (int n : temp) { // temp배열 값을 하나씩 n에 적용
if (n != 0) {
count++;
}
}
int[] answer = new int[count];
count = 0;
for (int n : temp) {
if (n != 0) {
answer[count++] = n; // answer 배열에 temp 값 넣기
}
}
return answer;
}
public static void main(String[] args) {
Pro42586 T = new Pro42586();
System.out.println(Arrays.toString(T.solution(new int[]{93, 30, 55}, new int[]{1, 30, 5})));
}
}
Java
복사
•
Queue
package algo250311;
// 기능개발 - Lv2, Queue 사용
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class Pro42586_2 {
public int[] solution(int[] progresses, int[] speeds) {
// progresses의 각 인덱스 값이 100을 넘는 최소일수를 담을 queue 선언
Queue<Integer> queue = new LinkedList<>();
int length = progresses.length;
// (100 - 30) / 30 => 2
for (int i = 0; i < length; i++) {
queue.add((int) (Math.ceil((100.0 - progresses[i]) / speeds[i])));
}
List<Integer> answer = new ArrayList<>();
while (!queue.isEmpty()) {
int day = queue.poll();
int cnt = 1; // 해당일자에 배포되는 총 기능 수 세기 위한 변수
while (!queue.isEmpty() && day >= queue.peek()) {
cnt++;
queue.poll();
}
answer.add(cnt);
}
return answer.stream().mapToInt(Integer::intValue).toArray();
}
}
Java
복사
느낀 점
•
알고리즘 문제풀이를 꾸준히 진행해왔지만 문제를 풀면 풀수록 점점 더 어렵게 느껴진다. 접근 자체가 안 되는 경우가 있는가 하면 문제는 이해했는데 코드로 작성이 전혀 안 되는 경우도 허다하다. 그렇다고 쉬운 문제만 계속 풀면 실력이 늘지 않기 때문에 레벨이 있는 문제들을 풀면서 시행착오를 계속 겪어나가야 한다고 생각한다.