2024. 1. 23. 10:24ㆍIT/TIL
오늘의 TIL은 프로그래머스의 문제 중의 '기능개발'이라는 문제의 내용이다.
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/42586
문제의 내용을 설명하면
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문을 사용할 수 있었다.
다만 이 문제의 태그가 스택/큐로 되어있어서 스택이나 큐를 이용하여 문제를 푸는 방법도 있을 것으로 예상되는데,
추후에 해당 방법을 이용한 문제 풀이를 확인해볼 예정이다.
'IT > TIL' 카테고리의 다른 글
20240124_옹알이(프로그래머스) (2) | 2024.01.25 |
---|---|
20240123_기능개발(프로그래머스)_큐 이용 (0) | 2024.01.23 |
20240120_2의 거듭 제곱 (0) | 2024.01.21 |
20240119_뒤에 있는 큰 수 찾기(프로그래머스) (0) | 2024.01.20 |
20240118_C#에서의 ref, out (0) | 2024.01.18 |