기능개발
문제 설명
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
예시
progresses | speeds | return |
[93, 30, 55] | [1, 30, 5] | [2, 1] |
[95, 90, 99, 99, 80, 99] | [1, 1, 1, 1, 1, 1] | [1, 3, 2] |
코드 해석 및 전체 코드
첫번째 풀이
1. 첫번째 기능 개발의 날짜를 구한다.(=day)
다음 기능 개발의 날짜와 비교하기 위해 기준이 되는 첫번째 기능 개발의 날짜를 구한 후 시작한다.
예) progresses[0] = 30
예) speeds[0] = 30
int day = (100 - progresses[0]) / speeds[0];
→ (100 - 30) / 30 = 2
if((100 - progresses[0]) % speeds[0] != 0) day++;
→ (100 - 30) % 30(= 10) != 0
→ day++ = 3
예의 경우 기능 개발을 3일간 개발해야 한다. 따라서 speed로 나누었을 때의 나머지가 0이 아닐 경우 하루를 더해줘야 한다.
2-1. 첫번째 기능을 제외한 남은 기능만큼 for문 반복 (1 ~ progresses.length)
2-2. 현재 기능 개발 날짜 구하기(= workingDay)
2-3. workingDay가 day보다 클 경우
0번째가 배포되지 않은 상태고
1번째 기능 개발날짜가 0번째보다 클 경우에는
함께 배포하지 못하므로
1차 배포에는 0번째만 가능하므로 반환 배열인 list에 cnt값을 넣어준다.
이때 cnt는 배포 가능한 기능 수이다.
2-4. workingDay가 day보다 작거나 같을 경우
0번째가 배포되지 않은 상태고
1번째 기능 개발 날짜가 0번째와 같거나 작을 경우
함께 배포가 가능하다.
그러므로 n번째 배포 가능한 기능 수를 저장하는 cnt의 값을 1 증가 시킨다.
3. for문이 마무리 되고 cnt의 값이 1일 경우
즉 마지막 cnt는 추가적으로 반환 list에 넣어주어야 한다. 그래서 for문이 끝나고 list.add(cnt)를 해준다.
import java.util.ArrayList;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
ArrayList<Integer> list = new ArrayList<>();
int cnt = 1;
int day = (100 - progresses[0]) / speeds[0];
if((100 - progresses[0]) % speeds[0] != 0) day++;
for(int i = 1; i < progresses.length; i++){
int workingDay = (100 - progresses[i]) / speeds[i];
if((100 - progresses[i]) % speeds[i] != 0) workingDay++;
if(workingDay > day) {
list.add(cnt);
cnt = 1;
day = workingDay;
}
else cnt++;
}
list.add(cnt);
int[] answer = new int[list.size()];
for(int i=0; i < list.size(); i++){
answer[i] = list.get(i);
}
return answer;
}
}
두번째 풀이 | queue
문제 주제가 스택/큐라서 큐로 다시 풀어보았다.
1. 각 기능의 개발 날짜를 queue에 저장한다.
2-1. queue가 비었있지 않을 때까지 while문을 반복한다.
2-2. n차 배포의 기준이 되는 기능의 개발 날짜를 꺼낸다.
int day = queue.poll();
2-2-1. n차에 배포될 수 있는 기능의 수를 구한다.
// queue가 비어있지 않고, queue의 첫번째 값이 day보다 작거나 같을 경우 반복
while(!queue.isEmpty() && queue.peek() <= day) {
queue.poll(); // 첫번째 값 꺼내기
cnt++; // 배포 기능 수 증가
}
list.add(cnt); // 배포 가능한 기능 수 반환 list에 추가하기
queue.poll()
poll 메소드는 queue의 첫번째 값을 꺼내고 반환한다.
queue.peek()
peek 메소드는 queue의 첫번째 값을 단순히 참조한다.
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
ArrayList<Integer> list = new ArrayList<>();
Queue<Integer> queue = new LinkedList<>();
for(int i = 0; i < progresses.length; i++){
int workingDay = (100 - progresses[i]) / speeds[i];
if((100 - progresses[i]) % speeds[i] != 0) workingDay++;
queue.add(workingDay);
}
while(!queue.isEmpty()){
int cnt = 1;
int day = queue.poll();
while(!queue.isEmpty() && queue.peek() <= day){
queue.poll();
cnt++;
}
list.add(cnt);
}
int[] answer = new int[list.size()];
for(int i=0; i < list.size(); i++){
answer[i] = list.get(i);
}
return answer;
}
}
'코딩 테스트 > [JAVA] programmers 코딩 테스트 연습' 카테고리의 다른 글
[Programmers/JAVA] 더 맵게 / 프로그래머스 코딩 테스트 연습 (0) | 2022.06.28 |
---|---|
[Programmers/JAVA] 영어 끝말잇기 / 프로그래머스 코딩 테스트 연습 (0) | 2022.06.27 |
[Programmers/JAVA] 없는 숫자 더하기 / 프로그래머스 코딩 테스트 연습 (0) | 2022.06.27 |
[Programmers/JAVA] 주식가격 / 프로그래머스 코딩 테스트 연습 (0) | 2022.01.04 |
[Programmers/JAVA] 큰 수 만들기 / 프로그래머스 코딩 테스트 연습 (0) | 2022.01.03 |
댓글