https://school.programmers.co.kr/learn/courses/30/lessons/42586
풀이
List<int> answer = new List<int>();
int n = progresses.Length;
int[] days = new int[n];
for (int i = 0; i<n; i++)
{
int remain = 100 - progresses[i];
days[i] = (remain + speeds[i] - 1) / speeds[i];
}
int count = 1;
int curReleaseDay = days[0];
for (int i = 1; i< n; i++)
{
if (curReleaseDay >= days[i])
{
count++;
}
else
{
answer.Add(count);
curReleaseDay = days[i];
count = 1;
}
}
answer.Add(count);
return answer.ToArray();
잘못되 접근 방식 : 시뮬레이션 방식으로 하루 하루 더해서 완료가 되는 시점으로 계산하려고 했음
(문제 자체를 시간에 흐름으로 처리하려고 했음)
올바른 접근방식 :
하루가 지남에 따라 완료 시점을 그때마다 확인하는 것이 아니라, 각 기능이 언제 완료되는가를 먼저 구하는 방식이 맞다.
이번 문제에서 알아야할 나눗셈 처리
for (int i = 0; i<n; i++)
{
int remain = 100 - progresses[i];
days[i] = (remain + speeds[i] - 1) / speeds[i];
}
1을 빼는 이유는???
왜 단순히 remain / speed를 쓰면 안될까?
C#의 정수 나눗셈은 항상 소수점을 버린다.(내림)
ex) remain = 80, speed = 30일때, remain / speed = 2가 나온다.
Day 1 : 0 -> 30
Day 2 : 30 -> 60
Day 3 : 60 -> 90 (완료)
하지만 완료되는 시점은 3이다.
그러면 remain에다가 speed만 더하고 나누면 되지 않나? 생각하지만, 그렇다면 -1은 왜필요할까?
위 예시 remain = 80, speed = 30인 경우는 맞다.
하지만, 나눗셈이 딱 떨어지는경우
ex) remain = 60, speed, 30일때는 맞지 않다.
Day 1 : 0 -> 30
Day 2 : 30 -> 60(완료) 2일걸림
그래서 나눠 떨어지지 않는 경우와 나눠 떨어지는 경우
모두 고려해서 -1처리가 필요하다.
문제를 마무리하면서 느낀점은 과정을 시뮬레이션 하지말고, 결과가 결정되는 시점을 계산하는 방식으로 접근하자..!!!
'Unity' 카테고리의 다른 글
| Unity) async/await/UniTask 비동기/코루틴/스레드 (1) | 2025.12.20 |
|---|---|
| [Unity] DI 로그인샘플 내부 동작 흐름과 결과 - 3 (1) | 2025.11.14 |
| [Unity] VContainer DI와 로그인 흐름 구조화하기 - 2 (0) | 2025.11.12 |
| [Unity] 유저 분산 시스템 구현기 - 유저 몰림 현상 해결하기 (0) | 2025.11.07 |
| unity) Android gradle (0) | 2025.05.16 |
