· 문제 설명
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다. 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
· 제한 사항
작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
작업 진도는 100 미만의 자연수입니다.
작업 속도는 100 이하의 자연수입니다.
배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.
· 입출력 예
progresses | speeds | return |
[93, 30, 55] | [1, 30, 5] | [2, 1] |
· 입출력 예 설명
첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다.
두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다.
세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다.
따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.
· Thinking 1
import java.util.ArrayList;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] temp = new int[progresses.length];
ArrayList<Integer> answer = new ArrayList<Integer>();
for (int i = 0; i < progresses.length; i++) {
int cnt = 0;
while (true) {
progresses[i] += speeds[i];
cnt++;
if (progresses[i] >= 100) {
break;
}
}
temp[i] = cnt;
}
int index = 1;
while (index < progresses.length) {
int cnt = 1;
int j = index-1;
while (j >= 0) {
if (temp[index] <= temp[j]) {
cnt++;
j--;
} else {
break;
}
}
answer.add(cnt);
index++;
}
return answer.stream().mapToInt(i -> i).toArray();
}
}
테스트 케이스 딱 한개만 통과.. 뭐가 문제일까 ㅠㅠ
· Thinking 2
예제 1)
progresses : [40, 93, 30, 55, 60, 65]
speeds : [60, 1, 30, 5 , 10, 7] // 1, 7, 3, 9, 4, 5
return : [1,2,3]
[ 1, 7, 3, 9, 4, 5 ]
temp(0) >= temp(1) ? no / cnt = 1
-> temp.remove(0 ~ cnt-1)
[ 7, 3, 9, 4, 5 ]
temp(0) >= temp(1) ? yes / cnt = 2
temp(0) >= temp(2) ? no
-> temp.remove(0 ~ cnt-1)
[9, 4, 5]
temp(0) >= temp(1) ? yes / cnt = 2
temp(0) >= temp(2) ? yes / cnt = 3
-> temp.remove(0 ~ cnt-1 )
예제 2)
progresses : [93, 30, 55, 60, 40, 65]
speeds : [1, 30, 5 , 10, 60, 7] // 7, 3, 9, 4, 1, 5
return : [2,4]
세 번이상의 시행착오를 통해......
· 완성 코드
import java.util.ArrayList;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
ArrayList<Integer> temp = new ArrayList<Integer>();
ArrayList<Integer> answer = new ArrayList<Integer>();
for (int i = 0; i < progresses.length; i++) {
int cnt = 0;
while (true) {
progresses[i] += speeds[i];
cnt++;
if (progresses[i] >= 100) {
break;
}
}
temp.add(cnt);
}
while (temp.size() != 0) {
int cnt = 1;
for (int j = 1; j < temp.size(); j++) {
if (temp.get(0) >= temp.get(j)) {
cnt++;
} else {
break;
}
}
for (int i = 0; i < cnt; i++) temp.remove(0);
answer.add(cnt);
}
return answer.stream().mapToInt(i -> i).toArray();
}
}
리얼 감격스럽다....!
Arraylist를 remove 하게되면 해당 인덱스가 삭제되기 때문에
본래 인덱스가 i였던 값은 i-1이 된다는 것 명심..
· 다른 사람의 풀이
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] dayOfend = new int[100];
int day = -1;
for(int i=0; i<progresses.length; i++) {
while(progresses[i] + (day*speeds[i]) < 100) {
day++;
}
dayOfend[day]++;
}
return Arrays.stream(dayOfend).filter(i -> i!=0).toArray();
}
}
어떻게 구현되는 원리인지 디버깅해봐야겠음 ㅠㅠ
· 문제 출처
https://programmers.co.kr/learn/courses/30/lessons/42586
'Algorithm > Programmers' 카테고리의 다른 글
다음 큰 숫자 (0) | 2019.06.04 |
---|---|
다리를 지나는 트럭 (0) | 2019.06.04 |
구명보트 (0) | 2019.06.04 |
N개의 최소공배수 (0) | 2019.06.04 |
JadenCase 문자열 만들기 (0) | 2019.06.04 |
댓글