❓문제설명
기능개발
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🔍문제해석
어떤걸 풀어야 할까?
- 개발건들의 현재 진척도와 하루동안 진행가능한 작업량(지문에서는 작업속도)이 주어진다.
- 개발건들은 순서대로 배포되어야하며, 앞선 개발건이 배포될 때 그 다음 개발건도 완성되었다면 같이 배포할 수 있다.
- 배포할때 마다 몇 건의 개발건이 반영되는 지를 구해라.
🧐문제풀이
- 문제 풀이 구상
맨 앞 순서의 개발건의 100%가 될 날짜를 구한다.
남은 개발건들에게 날짜 * 작업속도를 구한 뒤 더한다.
100% 이상인 개발건은 poll하여 같이 배포하도록 한다.
- 알고리즘 선택
순서대로 배포되어야하기에 FIFO, queue를 선택하였다.
!제출코드
- 현재 진척도와 속도를 queue에 담는다.
- 가장 앞에있는 개발건을 가져와서 완료가능한 날짜를 구한다.
- 각 개발건에 그 날짜*속도를 구하여서 더한다.
- while문을 돌면서 100% 이상인 개발건들은 꺼낸다.
- 꺼낸 건수를 정답 리스트에 담는다.
- 리스트를 스트림을 이용해 배열로 만든다.
import java.util.*;
class Solution {
public static int[] solution(int[] progresses, int[] speeds) {
List<Integer> answerList = new ArrayList<>();
Queue<Integer> progressQueue = new LinkedList<>();
Queue<Integer> speedQueue = new LinkedList<>();
// (1)
for(int progress : progresses) {
progressQueue.offer(progress);
}
for(int speed : speeds) {
speedQueue.offer(speed);
}
while(!progressQueue.isEmpty()) {
// (2)
int progress = progressQueue.peek();
int speed = speedQueue.peek();
int remainder = (100 - progress) % speed;
int day = (100 - progress) / speed ;
if(remainder > 0) day++;
// 큐의 크기를 저장
int size = progressQueue.size();
// 큐의 요소를 반복하며 처리하고 다시 넣기
for (int i = 0; i < size; i++) {
// (3)
int speedElement = speedQueue.poll();
Integer element = progressQueue.poll() + (day * speedElement); // 큐에서 요소 제거
progressQueue.offer(element); // 요소를 다시 큐에 추가
speedQueue.offer(speedElement); // 요소를 다시 큐에 추가
}
int count = 0;
while(!progressQueue.isEmpty() && progressQueue.peek() >= 100 ) {
// (4)
if(progressQueue.peek() >= 100) {
progressQueue.poll();
speedQueue.poll();
count++;
}
}
// (5)
answerList.add(count);
}
// (6)
int[] answer = answerList.stream().mapToInt(i -> i).toArray();
return answer;
}
}
✅ 더 좋은 코드로...
테스트에 통과되긴했지만, 썩 깔끔한 코드가 아니라고 생각한다.
개발건과 속도의 인덱스 싱크를 맞추기 위해 queue를 사용했지만, 무분별하게 사용한게 아닌지 아쉬워서 다른 분들의 풀이를 찾아보았다.
그러다가 내가 의도한 로직과 비슷하지만 훨씬 깔끔한 풀이를 발견하였다.
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
// 완료할 날을 담을 queue
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);
// 만약 queue에 데이터가 있고, 현재 완료날짜보다 적을때 (같은날에 완료되지 않음)
if (!q.isEmpty() && q.peek() < date) {
// 정답 리스트에 queue 사이즈를 담고(이전꺼 배포)
answerList.add(q.size());
// queue 클리어
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;
}
}
개발건이 아니라 완료날짜를 queue에 넣어서 해결하였다.
참고해서 나도 다음에는 더 좋은 풀이를 남기기를..!
728x90
반응형
'개발 공부 > 코딩테스트 연습' 카테고리의 다른 글
[프로그래머스 Lv3][자바] 양과 늑대 (0) | 2024.09.12 |
---|---|
[프로그래머스 Lv3][자바] 거스름돈 (1) | 2024.09.11 |
[프로그래머스 Lv3][자바] 합승 택시 요금 (3) | 2024.09.07 |
[프로그래머스 Lv2][JAVA] 무인도 여행 (2) | 2024.09.05 |
[프로그래머스 Lv2][JAVA] 게임 맵 최단거리 (1) | 2024.09.03 |