[C#] 기능개발

Connected Brain·2025년 8월 21일
0

코딩 테스트

목록 보기
59/67

기능개발

문제 설명

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 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();
        }
    }
}

Feature 클래스

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를 반환

0개의 댓글