프로그래머스 - 기능 개발(스텍, 큐) LV.2

Justin·2022년 5월 30일
0

알고리즘 풀이

목록 보기
1/7

문제 이해

문제를 이해해야 어떤 알고리즘을 통해 풀어낼 수 있을지 고민을 할 수 있기에 문제 부터 이해하는 시간을 가졌다.

입력 값으로 progresses, speeds가 주어지고, return을 값을 출력하도록 구현해야하는 문제다.


처음에 설명을 보고 조금 헷갈렸는데, 일단 100을 기준으로 progresses 만큼 완료하고 남은 작업률을 speeds의 속도로 일처리를 한다고 가정하고 며칠이 걸리나 계산을 하고,

동시에 일처리가 가능하기에 예시 처럼 7일만에 끝내고, 3일만에 끝낸다면 앞의 처리 기간인 7일이 끝날 때 3일만에 끝낸 작업을 같이 배포해야 한다.

즉, 뒤에 배포일자가 빨라도 앞의 배포일자가 끝날 때 까지 기다렸다가 같이 배포를 해야하기에 7일차에 2개, 9일 차에 1개의 기능이 구현되어야 한다.

문제 풀이 방식 생각

우선 progresses, speeds 를 통해 받은 값을 며칠이나 걸리는지 계산해야한다.

int[] remainDays = new int[progresses.Length];

            // 남은 워킹데이 구하기
            for (int i = 0; i < progresses.Length; i++)
            {
                float tem = 0;
                tem = (100 - progresses[i]) / (float)speeds[i];
                if (tem / (int)tem > 1)
                    remainDays[i] = (int)tem + 1;
                else
                    remainDays[i] = (int)tem;
            }

완료 기준인 100에서 progresses만큼을 빼주고, 그걸 스피드로 나누어주면 며칠이 남는지 알 수 있다. int형을 쓰면 일자 계산이 정확해지지 않아 float형으로 캐스트 하고 계산했다.

그 다음은 만약 2.3일이 걸린다면 3일로 처리하는 소수점 반올림 과정이 필요하다. Math.Round를 쓰면 반올림은 되지만, 여기서는 0.1이라도 높으면 다 +1 처리를 해주어야 하기에 tem과 tem을 나누었다.

if (tem / (int)tem > 1)
    remainDays[i] = (int)tem + 1;

문제점 및 해결

이제 일수 처리는 구했는데, 그 다음 어떻게 해야할지 잘 생각이 들지 않았다. 구한 일수대로 배열에 넣어가며 어떻게든 해보려했지만, 코드가 너무 지저분해지고 예외상황에서는 이상한 값이 나와 힌트를 얻어보고자 다른 코드를 참고했다.

  • List형 사용, List.Add() 사용

평소 List를 자주 사용하지는 않는데, 그렇다 보니 써야겠다 라는 생각을 못했던 거 같다.

remainDays 배열에 담긴 값을 한 번에 몇개씩 배포가 가능한지 계산 후 List.Add()를 통해 넣어주면 원하는 값을 구할 수 있다.

 List<int> counts = new List<int>();
            for (int i = 0; i < remainDays.Length;)
            {
                int count = 1;

                for (int j = i + 1; j < remainDays.Length; j++)
                {
                    // 7이 크거나 같을 때 본인이거나, 같으면 + 해준다
                    // 아니면 바로 브레이크 하고 다음 체크
                    if (remainDays[i] >= remainDays[j])
                        count++;
                    else
                        break;
                }
                
                i += count;
                counts.Add(count);
            }

오늘 후기

요즘은 게임 제작, 서버 공부만 하며 알고리즘 풀이를 등한시 했는데, 오랜만에 알고리즘 문제를 풀어보니 뇌가 굳은 느낌이었다. 어떻게 풀어야할지 빠르게 생각이 들지 않아 아쉽다.

다시 1레발 부터 차근차근 풀어서 더 많은 경우의 수를 생각하는 힘을 길러야겠다.

profile
인디 게임을 만들며 공부하고 있습니다.

0개의 댓글