20240122_기능개발(프로그래머스)

2024. 1. 23. 10:24IT/TIL

오늘의 TIL은 프로그래머스의 문제 중의 '기능개발'이라는 문제의 내용이다.

 

문제 링크

 

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

 

프로그래머스

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

programmers.co.kr

 

문제의 내용을 설명하면

 

int[] progresses로 주어지는 배열에 현재 프로그램의 개발 진도가 주어지고

int[] speeds로 주어지는 배열에 인덱에 해당하는 프로그램의 개발 속도가 주어진다.

각 개발은 병렬로 이뤄지고, 배포는 앞의 기능이 배포될 때 함께 배포된다.

배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이뤄진다.

예를 들어서 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어진다.

 

이 경우에 각 배포마다 몇 개의 기능이 배포되는지를 return하시오.

 

 

하루에 배열 progresses에 있는 숫자들에 각 인덱스에 매칭되는 speeds의 숫자들이 더해지는 것인데,

이 때, 작업의 개발 진도가 100이상이 되면 배포를 하게된다.

단, 배포는 이전에 있는 작업이 배포되거나 배포된 상태에서만 배포할 수 있게된다.

예를 들어서 아래와 같이 progresses가 주어진 경우에

하루가 지나면 progresses는 {94, 60, 60}로

이틀이 지나면 {95, 90, 65}로, 3일이 지나면 {96, 120(개발 완료), 70}이 되지만,

첫 번째 기능이 개발이 안됬기 때문에 첫 번째 개발이 완료되는 순간 같이 배포되게 된다.

7일이 지나면 {100(개발 완료), 120(개발 완료), 90} 이 되므로

7일째에 2개를 배포하고 9일째에 마지막 기능이 완료되어 배포하게 된다.

int[] progresses = {93, 30, 55};
int[] speeds = {1, 30, 5};

 

 

전체 코드

static void Main(string[] args)
{
    int[] progresses = { 93, 30, 55 };
    int[] speeds = { 1, 30, 5 };

    int[] result = new int[] { };

    result = Develop(progresses, speeds);

    return result;
}

static public int[] Develop(int[] progresses, int[] speeds)
{
    List<int> Comp = new List<int>();
    List<int> costTime = new List<int>();

    for (int i = 0; i < progresses.Length; i++)
    {
        int days = (100 - progresses[i] + speeds[i] - 1) / speeds[i];
        Comp.Add(days);
    }

    while (Comp.Count > 0)
    {
        int curDay = Comp[0];
        Comp.RemoveAt(0);
        int cost = 1;

        while (Comp.Count > 0 && Comp[0] <= curDay)
        {
            cost++;
            Comp.RemoveAt(0);
        }

        costTime.Add(cost);
    }
    
    return costTime.ToArray();
}

 

Main 함수의 부분에서 다른 처리는 없기 때문에 int[] Develop(int[] progresses, int[] speeds)를 살펴보면

static public int[] Develop(int[] progresses, int[] speeds)
{
    List<int> Comp = new List<int>();
    List<int> releaseCount = new List<int>();

    for (int i = 0; i < progresses.Length; i++)
    {
        int days = (100 - progresses[i] + speeds[i] - 1) / speeds[i];
        Comp.Add(days);
    }

 

우선 처음에 기능이 완성될 때까지 소요되는 일수를 담는 Comp 리스트와

각 배포에 배포되는 기능을 수를 담는 releaseCount 리스트를 만들고,

각 기능들에 소모되는 기능들의 일수를 구해서 Comp에 추가한다.

    while (Comp.Count > 0)
    {
        int curDay = Comp[0];
        Comp.RemoveAt(0);
        int cnt = 1;

        while (Comp.Count > 0 && Comp[0] <= curDay)
        {
            cnt++;
            Comp.RemoveAt(0);
        }

        releaseCount.Add(cnt);
    }
    
    return releaseCount.ToArray();
}

 

이후에 Comp의 원소가 없어질 때까지,

가장 처음에 있는 기능이 개발되는 시점마다 같이 배포되는 기능의 숫자를 cnt로 지정하여 releaseCount 함수에 추가한다.

 

 

위와 같은 방식으로 List와 while문을 이용하여 문제를 해결했는데,

문제의 핵심은 맨 앞에 있는 기능이 개발이 완료된 순간,

그 기능과 연결된 기능들 중에서 개발이 완료된 기능들의 숫자를 찾는 방법으로 while문을 사용할 수 있었다.

다만 이 문제의 태그가 스택/큐로 되어있어서 스택이나 큐를 이용하여 문제를 푸는 방법도 있을 것으로 예상되는데,

추후에 해당 방법을 이용한 문제 풀이를 확인해볼 예정이다.