728x90
반응형
Programmers 프로그래머스 42586 기능개발 문제는 작업 진도와 속도가 주어졌을 때, 각 배포마다 몇 개의 기능이 배포되는지 구하는 문제이다. 스택/큐 유형의 문제로 난이도는 Level 2이다.
Programmers 42586 기능개발 문제 정보
출처
- https://school.programmers.co.kr/learn/courses/30/lessons/42586
알고리즘 분류
- 스택/큐 (Stack/Queue)
난이도
- Level 2
주요 개념
- Queue 자료구조는 선입선출 (FIFO: First In First Out) 구조이다.
- 값 삽입
- add(value): 실패 시 Exception 발생
- offer(value): 실패시 false 반환
- 값 삭제
- remove(): Empty Queue 면 Exception 발생
- remove(value): 값이 존재하지 않으면 false 반환
- poll(): Empty Queue 면 null 반환
- 값 조회
- element(): Empty Queue 면 Exception 발생
- peak(): Empty Queue 면 null 반환
- isEmpty(): Empty Queue 면 true, 아니면 false 반환
- size(): Queue 의 크기(원소 개수) 반환
- clear(): Queue 비우기
- contains(value): Queue 내에 값이 존재하면 true, 아니면 false
728x90
문제 풀이 과정
- 각 프로세스 별로 배포 날까지 며칠이 남았는지 계산하여 Queue에 추가한다.
- 배포할 프로세스의 남은 일 수를 변수(prevDay)에 저장해 놓고
- Queue 에서 poll 하여 비교하여 같이 배포할 프로세스 수를 카운트한다.
- 남은 일 수가 더 많이 남은 프로세스를 만나면 다음에 배포하기 위해 변수(prevDay)에 덮어쓰고
- 카운팅 한 값을 배포 개수 배열(counts)에 add 하고 초기화한다.
- 위 과정을 Queue 가 빌 때까지 반복한다.
- while을 다 돌면 마지막 배포 개수를 add 해준다.
주의
배포 날까지 남은 일 수 구할 때 나눠 떨어지지 않으면 +1 해주어야 한다.
나눈 값을 double로 변환하여 소수 점을 올림하는 Math.ceil()을 써도 되고,
필자는 나머지가 있으면 +1 하여 int로 관리하였다.
case 11 반례
progresses: [94, 93]
speeds: [2, 2]
return: [1, 1]
반응형
코드 및 설명
// Queue
public static int[] solution_Queue(int[] progresses, int[] speeds) {
int[] answer = {};
List<Integer> counts = new ArrayList<>();
Queue<Integer> days = new LinkedList<>();
// 배포까지 남은 일 수 계산
for (int i = 0; i < progresses.length; i++) {
days.offer(calculateRemainDay(progresses[i], speeds[i]));
}
// 각 배포마다 몇 개의 기능이 배포되는지 구하기
int cnt = 0;
int prevDay = days.peek();
while (!days.isEmpty()) {
Integer nowDay = days.poll();
if (nowDay <= prevDay) {
cnt++;
continue;
}
counts.add(cnt);
prevDay = nowDay;
cnt = 1;
}
counts.add(cnt);
// return 형식에 맞게 형변환
answer = counts.stream().mapToInt(Integer::intValue).toArray();
return answer;
}
// Array
public static int[] solution_Array(int[] progresses, int[] speeds) {
int[] answer = {};
List<Integer> counts = new ArrayList<>();
int[] days = new int[progresses.length];
// 배포까지 남은 일 수 계산
for (int i = 0; i < progresses.length; i++) {
days[i] = calculateRemainDay(progresses[i], speeds[i]);
}
// 각 배포마다 몇 개의 기능이 배포되는지 구하기
int cnt = 0;
int prevDay = days[0];
for (int day : days) {
if (day <= prevDay) {
cnt++;
continue;
}
counts.add(cnt);
prevDay = day;
cnt = 1;
}
counts.add(cnt);
// return 형식에 맞게 형변환
answer = counts.stream().mapToInt(Integer::intValue).toArray();
return answer;
}
// 배포까지 남은 일 수 계산
private static int calculateRemainDay(int progresses, int speeds) {
int remainDay = (100 - progresses) / speeds;
if ((100 - progresses) % speeds == 0) {
return remainDay;
}
return remainDay + 1;
}
관련 문제
[JAVA/Programmers] 12909 올바른 괄호 (자바/프로그래머스)
Programmers 프로그래머스 42586 기능개발 문제를 자바 Java로 풀어보았다. 난이도는 Level 2이다.
728x90
반응형
'Algorithm PS (JAVA) > Stack & Queue' 카테고리의 다른 글
[JAVA/Programmers] 12909 올바른 괄호 (자바/프로그래머스) (0) | 2024.05.23 |
---|
댓글