728x90
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
2번째 풀이
import java.util.*;
class Solution {
// 몇 개의 기능이 배포되는지 리턴
static int[] progresses, speeds;
static int day =0, cnt = 1, work =0, finished=0;
static ArrayList<Integer> result;
public int[] solution(int[] progresses, int[] speeds) {
this.progresses = progresses;
this.speeds = speeds;
result = new ArrayList<>();
for(int i=0; i<progresses.length; i++){
work = 100 - progresses[i];
int j = work / speeds[i];
if(work % speeds[i] != 0){
finished = j + 1;
}
else finished = j;
if(day >= finished){
cnt++;
}
else{
if(day!= 0) result.add(cnt);
cnt=1;
day = finished;
}
}
result.add(cnt);
// 앞 기능의 날짜 day=0; 7 0
// 100 - progresses[] > work 7 70 45
// work / speeds[], work%speeds[] 나머지가 0이 아니면 +1해주기 > finished = 7 3 9
// 앞에꺼 day가 더 큰 경우 ++ / day가 더 작은 경우 day = finished, array에 cnt 넣고 다시 1
int[] answer = new int[result.size()];
for(int i=0; i<result.size(); i++){
answer[i] = result.get(i);
}
return answer;
}
}
1번째 풀이
날짜 계산할 때 100말고 100.0 으로 해서 정수형 나눗셈 말고 double형 나눗셈 계산하도록 하기
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
ArrayList<Integer> a = new ArrayList<>();
int n = progresses.length;
int day = (int)Math.ceil((100.0-progresses[0])/speeds[0]);
int cnt = 1;
for(int i=1; i<n; i++){
int secondDay = (int)Math.ceil((100.0-progresses[i])/speeds[i]);
if(day>= secondDay){
cnt++;
}
else{
a.add(cnt);
cnt = 1;
day = secondDay;
}
}
a.add(cnt);
int[] answer = new int[a.size()];
for(int i=0; i<a.size();i++){
answer[i] = a.get(i);
}
return answer;
}
}
큐 버전
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
// 1) 각 기능 완료까지 필요한 '일' 계산(올림) → 큐에 저장
Queue<Integer> q = new ArrayDeque<>();
for (int i = 0; i < progresses.length; i++) {
int remain = 100 - progresses[i];
int days = (remain + speeds[i] - 1) / speeds[i]; // ceil
q.offer(days);
}
// 2) 선행 기능 기준으로 같은 날에 배포 가능한 것들을 묶어서 카운트
List<Integer> res = new ArrayList<>();
while (!q.isEmpty()) {
int current = q.poll(); // 현재 배포 묶음의 기준일
int count = 1;
// 다음 기능이 current 이내에 끝나면 같은 배포로 묶음
while (!q.isEmpty() && q.peek() <= current) {
q.poll();
count++;
}
res.add(count);
}
// 3) List → int[]
int[] answer = new int[res.size()];
for (int i = 0; i < res.size(); i++) answer[i] = res.get(i);
return answer;
}
}'Algorithm > Programmers' 카테고리의 다른 글
| [Lv.2] 짝지어 제거하기 : Java (0) | 2025.09.26 |
|---|---|
| 조이스틱 : Java (1) | 2025.07.05 |
| 완주하지 못한 사람 : Java (0) | 2025.07.05 |
| [Lv.2] 소수찾기 : Java (0) | 2025.07.05 |
| [Lv.2] 피로도 : Java / DFS+백트래킹 (0) | 2025.07.05 |