[programmers-lv2] 기능개발
[programmers-lv2] 기능개발
🙋♂️ 들어가며
이 문제를 보니 Queue의 느낌이 들었고, 병원 접수표를 뽑고 대기하는 FIFO과 같은 영역에 해당 알고리즘을 활용할 수 있겠다는 생각이 들었다.
거두절미하고 이번 문제에서는 조건을 보니 O(N^2)가 충분히 가능하고, O(N)도 가능하겠다.
그래서 총 2가지 풀이를 준비하였다
개발 완료시간을 배열로 만들어서 푸는 문제였다
testcase 1,2의 경우 각각 완료시간은 아래와 같겠다
testcase-1
1
int[] end_time = new int[] {7, 3, 9};
testcase-2
1
int[] end_time = new int[] {5, 10, 1, 1, 20, 1};
✅ 2중 반복문
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
// 1. 각 작업의 종료시간을 만들자
int N = speeds.length;
int[] answer = new int[N];
int[] end_time = new int[N];
for (int i = 0; i < N; i++) {
int cur_end_time = (int) Math.ceil( (100 - progresses[i]) / (double) speeds[i] );
end_time[i] = cur_end_time;
}
// 2. 종료시간 배열 값 추가
int size_idx = 0;
int start_idx = 0;
while (start_idx < N) {
int temp_cnt = 1;
for (int next_idx = start_idx + 1; next_idx < N; next_idx++) {
// 2-1. 만약 현재 숫자보다 다음 숫자가 작거나 같다면
if (end_time[start_idx] >= end_time[next_idx]) {
temp_cnt++;
}
// 2-2. 더 크면 break
else if (end_time[start_idx] < end_time[next_idx]) break;
}
// 2-3. 배열에 추가
answer[size_idx] += temp_cnt;
size_idx++;
// 2-4. 다음 시작 idx 갱신
start_idx += temp_cnt;
}
// 3. 결과 배열 반환
int[] res = new int[size_idx];
for (int i = 0; i < size_idx; i++) {
res[i] = answer[i];
}
return res;
}
}
✅ O(N)
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
// 1. 각 작업의 종료시간을 만들자
int N = speeds.length;
int[] answer = new int[N];
int[] end_time = new int[N];
for (int i = 0; i < N; i++) {
int cur_end_time = (int) Math.ceil( (100 - progresses[i]) / (double) speeds[i] );
end_time[i] = cur_end_time;
}
// 2. 종료시간 배열 값 추가
// 우선 첫 값만 삽입
int size_idx = 0;
answer[size_idx]++;
int max_num = end_time[size_idx];
for (int i = 1; i < N; i++) {
// 3. 가장 큰값보다 현재 값이 작거나 같으면 삽입
if (end_time[i] <= max_num) {
answer[size_idx]++;
}
// 4. 현재 값이 더 크다면 가장 큰 수 갱신
else if (end_time[i] > max_num) {
max_num = end_time[i];
size_idx++;
answer[size_idx]++;
}
}
// 5. 정답 배열
int[] res = new int[size_idx+1];
for (int i = 0; i < size_idx+1; i++) {
res[i] = answer[i];
}
System.out.println(size_idx);
return res;
}
}
This post is licensed under CC BY 4.0 by the author.
