프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
제한 사항
- 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
- 작업 진도는 100 미만의 자연수입니다.
- 작업 속도는 100 이하의 자연수입니다.
- 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.
using System;
using System.Collections.Generic;
public class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] answer = new int[] {};
//기능당 완료되는 일자를 저장하는 배열
int[] days = new int[progresses.Length];
//현재 진행중인 기능, 작업 속도, 퍼센테이지를 저장하는 정수형 변수
int progressing = 0, speed = 0 , persent = 0;
//기능과 속도를 큐에 정의
Queue<int> queue = new Queue<int>(progresses);
Queue<int> sppedQueue = new Queue<int>(speeds);
//최종 몇개의 기능이 저장될지 큐에 정의
Queue<int> res = new Queue<int>();
for(int i=0; i < progresses.Length; i++)
{
progressing = queue.Dequeue();
speed = sppedQueue.Dequeue();
persent = progressing;
while(true)
{
//퍼센트가 100과 같거나 넘으면 반복문 탈출
if(persent >= 100)
{
break;
}
//그렇지 않므녀 작업속도를 높여주고 일자 하루를 더함
else
{
persent = persent + speed;
days[i]++;
}
}
}
//첫 번째 기능 배포전 두 번째 기능이 완료 된 경우 waitDay를 통한 카운트
//몇 번의 배포를 저장하는 count 변수
int waitDay = 0, count = 1;
for(int i = 0; i < days.Length; i=waitDay+i)
{
//waitDay 초기화
waitDay = 0;
for(int j = i; j < days.Length; j++ )
{
//완료된 날짜 days[i], days[j] 가 같거나 days[i]가 더 클 때
if(days[i]>=days[j])
{
//waitDay 더하기
waitDay++;
}
//아닐 시 반복문 탈출
else
{
//배포 횟수 늘리기
count++;
break;
}
}
//waitDay가 0이 아니면 Queue에 waitDay 저장
if(waitDay!=0)
res.Enqueue(waitDay);
}
//count 배포 횟수 만큼 answer 배열 선언
answer = new int[count];
//반복문을 통한 answer 리턴
for(int i=0; i<count; i++)
{
answer[i] = res.Dequeue();
}
return answer;
}
}
댓글 영역