

깔깔
답지를 볼까 수많은 유혹의 생각들이 들었지만
보지 않고 스스로의 힘으로 해냈다
이렇게 발전해나가는 나..
제법 대견할지도?
각설하고,
문제를 풀어보자!
각 기능은 진도가 100%일 때 서비스에 반영할 수 있다.
또, 각 기능의 개발 속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있지만,
뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포된다.
배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와
각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때
각 배포마다 몇 개의 기능이 배포되는지를 return 하는 문제다.
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] answer = {};
ArrayList<Integer> q = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < speeds.length; i++) {
int num = (100 - progresses[i]) / speeds[i];
if ((100 - progresses[i]) % speeds[i] != 0) {
num++;
}
q.add(num);
}
int last = q.get(0);
int index = 0;
int cnt = 0;
while(true) {
if (index >= speeds.length) {
list.add(cnt);
break;
}
if (last < q.get(index)) {
list.add(cnt);
last = q.get(index);
cnt = 0;
} else {
index++;
cnt++;
}
}
return list.stream().mapToInt(i->i).toArray();
}
}
처음에는 queue를 사용해서
앞에서부터 하나씩 poll()할까 생각했지만,
queue는 index를 사용하지 못해서
내가 생각하는 방법에 적용할 수 없었고 arraylist로 변경했다.
먼저 배열에
(100 - progress(작업진도)) / speed(작업속도)를 넣어준다.
앞으로 100%가 될 때까지 며칠이 걸리는지를 나타낸다.
이때 주의해야 할 점은
만약 나머지가 있다면 올림해주어야 한다는 것이다.
그렇게 하고 last에 배열의 첫 번째 값을 저장,
index와 cnt는 0으로 초기화한 후
index를 마지막까지 돌며
다음 과정을 거친다.
- index가 배열 길이에 도달하면 마지막 cnt값을 list에 넣고 종료한다.
- last 값이 해당 index에 해당하는 배열 값보다 작으면
지금까지 쌓인 cnt값을 배열에 넣고, last를 해당 index의 값으로 바꾸고
cnt는 0으로 초기화한다.
- last 값이 해당 index에 해당하는 배열 값보다 크거나 같으면
함께 배포되어야할 친구들이므로 index와 cnt를 1씩 늘려주고
다음으로 넘어간다.
마지막에는 list를 int배열로 바꿔 출력하면 된다.
원래 생각한대로 queue를 사용한다면 어땠을까?
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> days = new LinkedList<>();
for (int i = 0; i < progresses.length; i++) {
int day = (100 - progresses[i]) / speeds[i];
if ((100 - progresses[i]) % speeds[i] != 0) {
day++;
}
days.add(day);
}
List<Integer> result = new ArrayList<>();
int current = days.poll();
int count = 1;
while (!days.isEmpty()) {
if (days.peek() <= current) {
days.poll();
count++;
} else {
result.add(count);
current = days.poll();
count = 1;
}
}
result.add(count); // 마지막 묶음
return result.stream().mapToInt(i -> i).toArray();
}
}
'Languages > Java' 카테고리의 다른 글
[프로그래머스 고득점 Kit/Java] 더 맵게 (0) | 2025.04.15 |
---|---|
[BOJ 길라잡이/Java] 14일차 #9095 1, 2, 3 더하기 (0) | 2025.04.06 |
[BOJ 길라잡이/Java] 13일차 #1182 부분수열의 합 (0) | 2025.04.01 |
[프로그래머스 고득점 Kit/Java] 같은 숫자는 싫어 (0) | 2025.04.01 |
[BOJ 길라잡이/Java] 12일차 #6603 로또 (0) | 2025.03.29 |


깔깔
답지를 볼까 수많은 유혹의 생각들이 들었지만
보지 않고 스스로의 힘으로 해냈다
이렇게 발전해나가는 나..
제법 대견할지도?
각설하고,
문제를 풀어보자!
각 기능은 진도가 100%일 때 서비스에 반영할 수 있다.
또, 각 기능의 개발 속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있지만,
뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포된다.
배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와
각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때
각 배포마다 몇 개의 기능이 배포되는지를 return 하는 문제다.
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] answer = {};
ArrayList<Integer> q = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < speeds.length; i++) {
int num = (100 - progresses[i]) / speeds[i];
if ((100 - progresses[i]) % speeds[i] != 0) {
num++;
}
q.add(num);
}
int last = q.get(0);
int index = 0;
int cnt = 0;
while(true) {
if (index >= speeds.length) {
list.add(cnt);
break;
}
if (last < q.get(index)) {
list.add(cnt);
last = q.get(index);
cnt = 0;
} else {
index++;
cnt++;
}
}
return list.stream().mapToInt(i->i).toArray();
}
}
처음에는 queue를 사용해서
앞에서부터 하나씩 poll()할까 생각했지만,
queue는 index를 사용하지 못해서
내가 생각하는 방법에 적용할 수 없었고 arraylist로 변경했다.
먼저 배열에
(100 - progress(작업진도)) / speed(작업속도)를 넣어준다.
앞으로 100%가 될 때까지 며칠이 걸리는지를 나타낸다.
이때 주의해야 할 점은
만약 나머지가 있다면 올림해주어야 한다는 것이다.
그렇게 하고 last에 배열의 첫 번째 값을 저장,
index와 cnt는 0으로 초기화한 후
index를 마지막까지 돌며
다음 과정을 거친다.
- index가 배열 길이에 도달하면 마지막 cnt값을 list에 넣고 종료한다.
- last 값이 해당 index에 해당하는 배열 값보다 작으면
지금까지 쌓인 cnt값을 배열에 넣고, last를 해당 index의 값으로 바꾸고
cnt는 0으로 초기화한다.
- last 값이 해당 index에 해당하는 배열 값보다 크거나 같으면
함께 배포되어야할 친구들이므로 index와 cnt를 1씩 늘려주고
다음으로 넘어간다.
마지막에는 list를 int배열로 바꿔 출력하면 된다.
원래 생각한대로 queue를 사용한다면 어땠을까?
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> days = new LinkedList<>();
for (int i = 0; i < progresses.length; i++) {
int day = (100 - progresses[i]) / speeds[i];
if ((100 - progresses[i]) % speeds[i] != 0) {
day++;
}
days.add(day);
}
List<Integer> result = new ArrayList<>();
int current = days.poll();
int count = 1;
while (!days.isEmpty()) {
if (days.peek() <= current) {
days.poll();
count++;
} else {
result.add(count);
current = days.poll();
count = 1;
}
}
result.add(count); // 마지막 묶음
return result.stream().mapToInt(i -> i).toArray();
}
}
'Languages > Java' 카테고리의 다른 글
[프로그래머스 고득점 Kit/Java] 더 맵게 (0) | 2025.04.15 |
---|---|
[BOJ 길라잡이/Java] 14일차 #9095 1, 2, 3 더하기 (0) | 2025.04.06 |
[BOJ 길라잡이/Java] 13일차 #1182 부분수열의 합 (0) | 2025.04.01 |
[프로그래머스 고득점 Kit/Java] 같은 숫자는 싫어 (0) | 2025.04.01 |
[BOJ 길라잡이/Java] 12일차 #6603 로또 (0) | 2025.03.29 |