프로그래머스

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

빙수빈수 2023. 10. 3. 15:46

https://school.programmers.co.kr/learn/courses/30/lessons/42586

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[문제]

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

 

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

 

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

 

[제한 사항]

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

 

[코드]

import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] answer = {};
        List<Integer> list=new ArrayList<>();
        int[] day=new int[progresses.length]; // 각 기능이 완성되기까지 걸리는 기간
        
        for(int i=0;i<progresses.length;i++) {
            int rest_percent=100-progresses[i]; // 남은 %
            
            // 남은 기능을 완성시키기 까지 걸리는 기간 계산
            if(rest_percent%speeds[i]==0)  
                day[i]=rest_percent/speeds[i];
            else
                day[i]=rest_percent/speeds[i]+1;
        }
         
        int past=day[0];
        int count=1;
        for(int i=1;i<day.length;i++) {
            // 이전 기능이 완성되기 전에 이미 끝난 경우 count 증가
            if(day[i]<=past)
                count++;
            
            // 다음 기능이 더 오래 걸리는 경우
            else {
                list.add(count); 
                // 초기화
                past=day[i];
                count=1;
            }
        }
        list.add(count); // 마지막 값 처리
        
        answer=new int[list.size()];
        for(int i=0;i<list.size();i++)
            answer[i]=list.get(i);
        
        return answer;
    }
}

 

[고찰]

 이번 문제는 배열을 사용하여 해결하였다. 각 기능을 완성하는데 걸리는 시간을 저장한 배열 day를 탐색하면서 현재 기능의 완성일 보다 더 적게 걸린 경우는 개수를 count 해주고, 시간이 더 오래 걸리는 기능이 나왔을 경우 count 값을 저장, past와 count 값을 초기와 해준다. 이때, day의 마지막 값의 처리를 위해 for문을 빠져나오고 나서도 count 값을 한번 더 저장해주어야 한다.