Backend
home
🪜

[프로그래머스] 기능개발

생성일
2025/03/11 12:59
태그
Programmers
게시일
2025/03/11
최종 편집 일시
2025/03/11 13:06

문제

해결 방안 고민

== 기능개발 == 진도가 100% 일 때 서비스에 반영 === 각 기능의 개발속도가 모두 다름 === - 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있음 - 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됨 - 뒤에 있는 기능은 앞에 있는 기능의 개발이 끝날 때까지 기다려야 함 === 조건 === 먼저 배포되어야 하는 순서대로 작업 진도가 적힌 정수 배열 progresses 각 작업의 개발 속도가 적힌 정수 배열 speeds 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수 작성 ======================= progresses.length = speeds.length progresses[i] += speeds[i]; 100이 되었는데 순서가 맨 앞이 아닌 2번째 혹은 3번째 - 대기 - 100이 된 수들은 speeds[i]를 더하면 안 됨!! - 100이 된 수가 아닌 100보다 크거나 같은 수를 제거해버리면 됨 기준: 맨 앞의 수
Markdown
복사
문제는 이해를 했는데 코드 구현이 쉽지 않아서 어려웠던 문제였다.

해결 방법

배열을 사용하는 방법과 Queue를 사용하는 방법이 있는데 두 가지 방법이 있다.
배열
범위가 100까지 이므로 길이를 100으로 하는 배열을 생성한다.
Queue
속도는 빠르지만 순서가 뒤에 있는 경우에는 앞의 작업이 끝나는 시점으로 간주하여 앞의 작업이 끝나는 일수로 계산
맨 앞의 일수를 기준으로 기능이 배포되는 프로세스의 개수를 리턴하도록 처리해야 함
속도가 30인 경우 30 * 4 = 120 > 100 (100을 초과해버리는 경우, 100으로 간주하여 완성되었다고 하는 로직 필요 => if (value > 100))

코드

배열
package algo250311; // 기능개발 - Lv2, Queue 사용 X import java.util.Arrays; public class Pro42586 { public int[] solution(int[] progresses, int[] speeds) { int[] temp = new int[100]; // 작업의 개수는 100개 이하여서 100으로 선언 int day = 0; // temp에 적용할 배포일 // 각 항목마다 100까지 검사해야 하기에 for문 안에 while문 작성 int length = progresses.length; for (int i = 0; i < length; i++) { while (progresses[i] + (speeds[i] * day) < 100) { day++; } temp[day]++; // 다음 기능 개발 일수도 증가 } int count = 0; // temp에 들어간 배열의 길이를 알기위한 코드 // temp는 초기에 0으로 선언되어 있으므로 0이 아닌 값만 측정하면 됨 for (int n : temp) { // temp배열 값을 하나씩 n에 적용 if (n != 0) { count++; } } int[] answer = new int[count]; count = 0; for (int n : temp) { if (n != 0) { answer[count++] = n; // answer 배열에 temp 값 넣기 } } return answer; } public static void main(String[] args) { Pro42586 T = new Pro42586(); System.out.println(Arrays.toString(T.solution(new int[]{93, 30, 55}, new int[]{1, 30, 5}))); } }
Java
복사
Queue
package algo250311; // 기능개발 - Lv2, Queue 사용 import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; public class Pro42586_2 { public int[] solution(int[] progresses, int[] speeds) { // progresses의 각 인덱스 값이 100을 넘는 최소일수를 담을 queue 선언 Queue<Integer> queue = new LinkedList<>(); int length = progresses.length; // (100 - 30) / 30 => 2 for (int i = 0; i < length; i++) { queue.add((int) (Math.ceil((100.0 - progresses[i]) / speeds[i]))); } List<Integer> answer = new ArrayList<>(); while (!queue.isEmpty()) { int day = queue.poll(); int cnt = 1; // 해당일자에 배포되는 총 기능 수 세기 위한 변수 while (!queue.isEmpty() && day >= queue.peek()) { cnt++; queue.poll(); } answer.add(cnt); } return answer.stream().mapToInt(Integer::intValue).toArray(); } }
Java
복사

느낀 점

알고리즘 문제풀이를 꾸준히 진행해왔지만 문제를 풀면 풀수록 점점 더 어렵게 느껴진다. 접근 자체가 안 되는 경우가 있는가 하면 문제는 이해했는데 코드로 작성이 전혀 안 되는 경우도 허다하다. 그렇다고 쉬운 문제만 계속 풀면 실력이 늘지 않기 때문에 레벨이 있는 문제들을 풀면서 시행착오를 계속 겪어나가야 한다고 생각한다.