Tiny Bunny
본문 바로가기

programmers

프로그래머스 2단계 : 기능개발 (Java 자바)

728x90
문제 설명

 

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

 

 

제한 사항

 

  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

 

입출력 예

 

 

 

풀이

 

이 문제는 작업의 진도와 개발 속도를 이용하여 각 배포마다 몇 개의 기능이 배포되는지를 계산하는 문제입니다.

 

1. que와 spd 큐에 작업 진도와 속도를 저장합니다.

2. 날짜(days)를 1부터 시작하여 각 날짜마다 작업 진도를 계산합니다.

3. 첫 번째 작업이 100% 이상인 경우, 그 작업 및 동일한 날짜에 완료된 작업들을 모두 처리하고, 완료된 작업 수를 array 리스트에 추가합니다.

4. 날짜를 증가시켜 다음 날짜로 넘어갑니다.

5. 모든 작업이 완료될 때까지 위 과정을 반복합니다.

6. 최종적으로 array 리스트에 저장된 완료된 작업 수를 결과 배열 answer에 저장하고 반환합니다.

 

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int complete; // 완료된 작업 수를 저장할 변수
        int days = 1; // 경과한 날짜를 나타내는 변수
        ArrayList<Integer> array = new ArrayList<>(); // 각 배포마다 완료된 작업 수를 저장할 리스트
        Queue<Integer> que = new LinkedList<>(); // 작업 진도를 저장하는 큐
        Queue<Integer> spd = new LinkedList<>(); // 작업 속도를 저장하는 큐
        
        // 작업 진도와 속도를 큐에 저장
        for (int i = 0; i < progresses.length; i++)
            que.add(progresses[i]);
        for (int i = 0; i < speeds.length; i++)
            spd.add(speeds[i]);
        
        while (!que.isEmpty()) {
            complete = 0; // 완료된 작업 수 초기화
            
            // 첫 번째 작업이 100% 이상이면 완료 처리
            if (que.peek() + spd.peek() * days  >= 100) {
                while(!que.isEmpty() && que.peek() + spd.peek() * days >= 100) {
                    complete++;
                    que.poll(); // 완료된 작업 제거
                    spd.poll(); // 완료된 작업의 속도 정보 제거
                }
                array.add(complete); // 완료된 작업 수를 리스트에 추가
            }
            days++; // 경과 일수 증가
        }
        
        // 결과 배열 생성
        int[] answer = new int[array.size()];
        for (int i = 0; i < array.size(); i++) {
            answer[i] = array.get(i);
        }
        
        return answer; // 결과 배열 반환
    }
}
728x90