알고리즘 스터디 2주차 과제로 기능개발 문제 풀이를 진행하였다.
코딩테스트 연습 - 기능개발 | 프로그래머스 스쿨 (programmers.co.kr)
import java.util.*;
class Solution {
public ArrayList<Integer> solution(int[] progresses, int[] speeds) {
//각 작업의 남은 작업 시간을 계산하여 remainedDays 배열에 추가
int [] remainedDays = new int [progresses.length];
for (int i =0; i<progresses.length; i++){
if((100-progresses[i])%speeds[i] != 0){
remainedDays[i] = (100-progresses[i])/speeds[i] + 1;
}else{
remainedDays[i] = (100-progresses[i])/speeds[i];
}
}
//remainedDays배열에서 선 작업의 남은 작업시간과 후 작업의 남은 작업 시간을 비교
ArrayList<Integer> answerList = new ArrayList<>();
int front = 0;
int count = 1;
for(int i=0; i<remainedDays.length; i++){
if((i+1)==remainedDays.length){
answerList.add(count);
break;
}
if(remainedDays[i+1]<=remainedDays[front]){
count++;
}else{
front = i+1;
answerList.add(count);
count=1;
}
}
return answerList;
}
}
다른 사람의 문제풀이를 참고하여 큐를 이용해 효율적으로 코드를 짤 수 있음을 알게 되었다.
Math.ceil
: 소수 값이 존재할 때 값을 올리는 역할을 하는 함수import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> q = new LinkedList<>();
List<Integer> answerList = new ArrayList<>();
//각 작업의 남은 작업 시간을 계산
for (int i = 0; i < speeds.length; i++) {
double remain = (100 - progresses[i]) / (double) speeds[i];
int date = (int) Math.ceil(remain);
if (!q.isEmpty() && q.peek() < date) {
answerList.add(q.size());
q.clear();
}
//큐에 데이터 삽입
q.offer(date);
}
answerList.add(q.size());
int[] answer = new int[answerList.size()];
for (int i = 0; i < answer.length; i++) {
answer[i] = answerList.get(i);
}
return answer;
}
}