ALGORITHM/PROGRAMMERS
[프로그래머스] 기능개발
0298
2021. 7. 26. 20:54
https://programmers.co.kr/learn/courses/30/lessons/42586?language=java
코딩테스트 연습 - 기능개발
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는
programmers.co.kr
2021-07-26
1. 배열? (not queue)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
List<Integer> list = new ArrayList<>();
int prev = (int) Math.ceil((double)(100 - progresses[0]) / speeds[0]);;
int count = 1;
for(int i = 1; i < progresses.length; i++) {
int tmp = (int) Math.ceil((double)(100 - progresses[i]) / speeds[i]);
if(prev >= tmp) {
count++;
} else {
prev = tmp;
list.add(count);
count = 1;
}
}
list.add(count);
int[] answer = new int[list.size()];
for(int i = 0; i < list.size(); i++) answer[i] = list.get(i);
return answer;
}
}
|
cs |
#문제풀이
사실 위에 분류가 스택/큐로 되어 있는걸 못 보고 그냥 풀었다.
원리는 동일할 것이다. progresses 배열과 speeds 배열을 통해 각각 작업을 하는데 걸리는 시간을 구한다.
이 때, 기준 작업 (prev)보다 적은 시간이 걸리는 작업들의 경우에만 한 번에 배포가 가능하다. 그래서, prev 보다 오래 걸리는 작업 시간 전까지 하나로 묶어서 생각해주면 된다.
2. Queue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> q = new LinkedList<>();
for(int i = 0; i < progresses.length; i++) {
q.add((int)Math.ceil((double) (100 - progresses[i])/speeds[i]));
}
List<Integer> list = new ArrayList<>();
if(!q.isEmpty()) {
int prev = q.poll();
int count = 1;
while (!q.isEmpty()) {
int cur = q.poll();
if (prev >= cur) {
count++;
} else {
list.add(count);
prev = cur;
count = 1;
}
}
list.add(count);
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
|
cs |
#문제풀이
글을 쓰면서 스택/큐로 분류 되었다는걸 알아서, queue를 사용해서도 한 번 풀어봤다.
위와 같은 방식으로 풀었다.