programmers.co.kr/learn/courses/30/lessons/42586
코딩테스트 연습 - 기능개발
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는
programmers.co.kr
✨ 문제 이해하기
- 기능은 진도가 100%일 때 서비스에 반영할 수 있다.
- 각 기능의 개발속도는 다르다. 앞의 기능과 뒤의 기능의 완성 시점이 다름.
- 먼저 배포되어야 하는 순서대로 progresses 라는 배열에 담겨져서 작업이 주어짐. 배열에 담긴 숫자는 작업의 진도.
- 작업 개발 속도는 speeds 라는 배열에 담겨져서 주어짐.
- 몇 개의 기능이 배포되는지 return 하도록 한다.
ex. progresses = [93, 30, 55] speeds = [1, 30, 5] /// return [2, 1]
1) 93% - 속도 1 - 1 * 7일 만큼 작업 필요
2) 30% - 속도 30 - 30 * 3일 만큼 작업 필요
3) 55% - 속도 5 - 5 * 9일 만큼 작업 필요
7일째 2개 기능 배포, 9일째 1개 기능 배포됨 [2, 1]
(2번째로 완성되는 기능은 1번째로 완성되는 기능을 기다려야 함)
ex. progresses = [95, 90, 99, 99, 80, 99] speeds = [1, 1, 1, 1, 1, 1] /// return [1, 3, 2]
1) 95% - 속도1 - 1 * 5일
2) 90% - 속도1 - 1 * 10일
3) 99% - 속도1 - 1 * 1일
4) 99% - 속도1 - 1 * 1일
5) 80% - 속도1 - 1 * 20일
6) 99% - 속도1 - 1 * 1일
5일째 1개 배포 가능. (기다릴게 없음)
10일째 3개 배포 가능. 3, 4 번째가 2번째를 기다려야 함.
20일째 2개 배포 가능. 6번째가 5번째 기다려야 함.
✨ 문제 해결방법 생각해보기
- 각 작업별로 몇일이 소요되는지 구해서 별도의 배열에 담아둔다.
- i 번째 작업이 그 다음번째 작업보다 적게 소요되는 경우 배포가 가능하다는 것.
- 만약 i번째 작업이 그 다음번째 작업보다 빨리 끝나면 잠시 i번째 작업 일수를 별도로 저장해두고계속 비교
- i번째 작업보다 오래 걸리는게 나오면 비교 대상을 해당 요소로 바꿔서 다시 비교.
✨ 소스코드
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
public class Progress1 {
public static void main(String[] args) {
int [] p = {95, 90, 99, 99, 99, 99};
int [] s = {1, 1, 1, 1, 1, 1};
//작업 속도는 100이하의 자연수
System.out.println("\n\n" + Arrays.toString(solution(p, s)));
}
public static int[] solution(int[] progresses, int[] speeds) {
int [] answer;
int len = progresses.length;
answer = new int[len];
if(len == 1){
answer = new int[]{1};
return answer;
}
Queue<Integer> queue = new LinkedList<>();
int idx = 0;
for (int i = 0; i < progresses.length; i++) {
int p = progresses[i];
int s = speeds[i];
//현재 작업일 cur
int cur = (int) Math.ceil(((double)100 - p) / s);
if(queue.peek() != null){
int top = queue.peek();
answer[idx] += 1;
if(top < cur){
answer[idx] = queue.size();
queue.clear();
idx++;
}
}
queue.offer(cur);
System.out.println(queue);
}
answer[idx] = queue.size();
return Arrays.copyOfRange(answer, 0, idx + 1);
}
}
> 큐의 사이즈를 answer 에다가 넣고 싶은데, 가장 마지막 요소가 큐에 넣어지고 for 문이 종료되기 때문에, 해당 요소에 대한 answer 값을 업데이트 할 수 가 없었다... 그래서 땜빵식으로 for문의 밖으로 나왔을 때 마지막 idx 에다가 queue 의 사이즈를 할당하였는데, 너무 이상한듯 ...
✨ 다른 사람의 풀이
'Algorithms' 카테고리의 다른 글
[Greedy] 미적으로 아름다운 나무 (0) | 2022.10.28 |
---|---|
[Deep Dive] QuickSort (0) | 2020.12.02 |
[프로그래머스] 연습문제 - 주식가격 (0) | 2020.11.30 |
[프로그래머스] 연습문제 - 위장 (0) | 2020.11.30 |