프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고,
이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열
progresses
와
각 작업의 개발 속도가 적힌 정수 배열speeds
가 주어질 때
각 배포마다 몇 개의 기능이 배포되는지를return
하도록solution
함수를 완성하세요.
public class FeatureDeploymentManager
{
private static int _featuresCount = 0;
private static int _completeCount = 0;
private static int _targetFeatureIndex = 0;
public static int[] Solution(int[] progresses, int[] speeds)
{
int featureNum = progresses.Length;
Feature[] features = new Feature[featureNum];
for (int i = 0; i < featureNum; i++)
{
features[i] = new Feature(i,progresses[i], speeds[i], ReleaseFeature);
}
List<int> releases = new List<int>();
while (_completeCount != featureNum)
{
foreach (var feature in features)
{
if(!feature.IsCompleted)
feature.UpdateProgress(_targetFeatureIndex);
}
if(_featuresCount > 0)
releases.Add(_featuresCount);
_featuresCount = 0;
}
return releases.ToArray();
}
private static void ReleaseFeature()
{
_featuresCount++;
_completeCount++;
_targetFeatureIndex++;
}
}
class Feature
{
private readonly int _index;
private readonly int _speed;
private readonly Action _onComplete;
private int _progress;
public bool IsCompleted = false;
public Feature(int index, int progress, int speed, Action onComplete)
{
_index = index;
_progress = progress;
_speed = speed;
_onComplete = onComplete;
}
public void UpdateProgress(int targetFeatureIndex)
{
_progress += _speed;
if (_progress >= 100 && targetFeatureIndex == _index)
{
IsCompleted = true;
_onComplete?.Invoke();
}
}
}
class Feature
{
private readonly int _index;
private readonly int _speed;
private readonly Action _onComplete;
private int _progress;
public bool IsCompleted = false;
public Feature(int index, int progress, int speed, Action onComplete)
{
_index = index;
_progress = progress;
_speed = speed;
_onComplete = onComplete;
}
public void UpdateProgress(int targetFeatureIndex)
{
_progress += _speed;
if (_progress >= 100 && targetFeatureIndex == _index)
{
IsCompleted = true;
_onComplete?.Invoke();
}
}
}
private readonly int _index;
private readonly int _speed;
private readonly Action _onComplete;
private int _progress;
public bool IsCompleted = false;
public Feature(int index, int progress, int speed, Action onComplete)
{
_index = index;
_progress = progress;
_speed = speed;
_onComplete = onComplete;
}
_index
변수로 확인_speed
그리고 기능 개발 완료시 실행되는 델리게이트 _onComplete
선언_progress
그리고 외부에서 해당 객체의 완료 여부를 확인할 때 사용하기 위한 IsCompleted
선언UpdateProgress()
함수 public void UpdateProgress(int targetFeatureIndex)
{
_progress += _speed;
if (_progress >= 100 && targetFeatureIndex == _index)
{
IsCompleted = true;
_onComplete?.Invoke();
}
}
private static int _featuresCount = 0;
private static int _completeCount = 0;
private static int _targetFeatureIndex = 0;
ReleaseFeature()
함수 private static void ReleaseFeature()
{
_featuresCount++;
_completeCount++;
_targetFeatureIndex++;
}
Feature
객체가 완료될 때 실행될 함수로 완료된 기능 수를 추가하고 전체 누적된 완료 기능 수도 추가하면서 다음 기능을 목표로 하도록 인덱스를 갱신 public static int[] Solution(int[] progresses, int[] speeds)
{
int featureNum = progresses.Length;
Feature[] features = new Feature[featureNum];
for (int i = 0; i < featureNum; i++)
{
features[i] = new Feature(i,progresses[i], speeds[i], ReleaseFeature);
}
List<int> releases = new List<int>();
while (_completeCount != featureNum)
{
foreach (var feature in features)
{
if(!feature.IsCompleted)
feature.UpdateProgress(_targetFeatureIndex);
}
if(_featuresCount > 0)
releases.Add(_featuresCount);
_featuresCount = 0;
}
return releases.ToArray();
}
progresses
의 길이만큼 Feature
객체가 생성되어야 하므로 배열을 만들어서 생성releases
리스트에 배포될 때마다 배포되는 기능의 숫자를 추가whlie
반복문에서는 기능의 숫자와 완료된 기능의 수가 같아질 때까지 Feature
배열을 순회하며 기능 개발을 진행_featuresCount
가 0보다 클 때 releases
리스트에 추가하고 이번 회차에서 기능 개수 추가를 완료했으므로 초기화releases
를 반환