프로그래머스 코딩 테스트 연습 문제 - 기능 개발 / JAVA 풀이 정리
https://school.programmers.co.kr/learn/courses/30/lessons/42586
풀이 방법
이 문제는 각 기능이 배포될 때마다 몇 개의 기능이 배포되는지를 구하는 문제이다.
각 기능별 작업 진도와 작업 속도를 이용하여 배포일을 계산하고, 배포일에 배포되는 기능 수를 구하면 된다.
기능별별 배포일 계산
- 작업 진도(progress)와 작업 속도(speed)를 이용하여 각 기능의 배포일을 계산
- 배포일 = (100 - 작업 진도) / 작업 속도)
배포일마다 배포될 기능 수 계산
- 배포일이 이전 배포일보다 크다면, 배포되는 기능 수를 1로 초기화하고 이를 결과에 추가
- 배포일이 이전 배포일보다 작거나 같다면, 이전 배포에서 계산한 배포되는 기능 수에 1을 더하기
- 최종적으로 구한 배포되는 기능 수를 반환
내가 작성한 코드
선언부와 작업별 남은 개발일 계산 코드
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Stack<Integer> dayStack = new Stack<>();
ArrayList<Integer> answerList = new ArrayList<>();
// 각 작업별로 배포까지 남은 개발일 계산(올림 처리)해서 Stack에 저장
for (int i = progresses.length - 1; i >= 0; i--) {
int remainingDays = (int) Math.ceil((double) (100 - progresses[i]) / speeds[i]);
dayStack.push(remainingDays);
}
// 이후 코드
ArrayList와 Stack을 사용할 것이기 때문에 import 해준다.
작업 완료일을 계산할 때 역순 순회를 했는데, 조건이 "앞에 있는 작업이 끝나야 뒤 쪽 작업을 배포할 수 있다"였으므로 역순 순회로 계산하는 것이 효율적이다.
배포일마다 배포될 기능 계산 코드
// 윗부분 코드
while (!dayStack.isEmpty()) {
int count = 1;
int top = dayStack.pop();
while (!dayStack.isEmpty() && top >= dayStack.peek()) {
dayStack.pop();
count++;
}
answerList.add(count);
}
int[] answer = new int[answerList.size()];
for (int i = 0; i < answerList.size(); i++) {
answer[i] = answerList.get(i);
}
return answer;
}
Stack에서 기능별 남은 작업일 값을 하나씩 pop해 값을 비교해준다.
while문 코드 설명
첫번째 기능의 남은 작업일이 두번째 기능의 남은 작업일보다 더 크다.
→ 첫번째 기능보다 두번째 기능이 먼저 완성된다. → 첫 배포일(첫 번째 기능이 배포되는 날)에 함께 배포된다.
이 방식으로 스택의 마지막 값까지 비교해 List에 담는다.
이 List값으로 결과 배열을 생성해 return한다. 끄읕
'Today I Learned > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 도둑질 - JAVA (0) | 2023.09.24 |
---|---|
[프로그래머스] 금과 은 운반하기 - JAVA (0) | 2023.09.22 |
[프로그래머스] 문자열 밀기 - JAVA (0) | 2023.09.21 |
[프로그래머스] 연속된 수의 합 - JAVA (0) | 2023.09.21 |
[프로그래머스] 하샤드 수 - JAVA (0) | 2023.09.21 |