https://www.acmicpc.net/problem/2525
오늘은 백준 문제를 풀다가 시간을 계산하는 코드에서 실수를 발견하고 수정한 과정을 정리해본다.
주어진 현재 시각(H, M)에 특정 시간(T)을 더했을 때, 새로운 시각을 계산하는 코드였다. 처음 작성한 코드는 아래와 같았다:
string[] s = Console.ReadLine().Split();
string t = Console.ReadLine();
int H = int.Parse(s[0]);
int M = int.Parse(s[1]);
int T = int.Parse(t);
int I = M + T;
int Y = I;
if (I >= 60 && I < 120)
{
Y = I % 60;
H = H + 1;
}
else if (I >= 120)
{
Y = I % 60;
H = H + 2;
}
if (H >= 24)
{
H = 0;
}
Console.WriteLine($"{H} {Y}");
조건문의 비효율성
I가 120 이상인 경우에만 2시간을 더하도록 작성했지만, 더 큰 값(예: 180, 240 등)은 제대로 계산되지 않았다.
24시간 이상일 때의 처리
H = 0으로 고정하면 자정을 넘어선 계산이 부정확했다. 예를 들어, H = 25라면 H = 1이어야 한다.
불필요한 변수 사용
I, Y와 같은 추가 변수로 인해 코드가 복잡해졌다.
문제를 해결하기 위해 분 단위로 계산을 단순화하고, 조건문을 제거했다.
아래는 수정된 코드다:
string[] s = Console.ReadLine().Split();
string t = Console.ReadLine();
int H = int.Parse(s[0]);
int M = int.Parse(s[1]);
int T = int.Parse(t);
int totalMinutes = M + T;
H += totalMinutes / 60; // 총 분에서 시간을 계산
M = totalMinutes % 60; // 남은 분 계산
H %= 24; // 24시간 이상일 경우 처리
Console.WriteLine($"{H} {M}");
totalMinutes를 사용한 단순화
M + T를 totalMinutes로 정의해 분과 시간을 한 번에 처리.
조건문 제거
나머지 연산(%)과 몫(totalMinutes / 60)으로 분과 시간을 분리해 조건문 없이 계산 가능.
24시간 이상 처리
H %= 24로 24시간 이상을 간단히 순환.
수학적 계산을 잘 활용하면 조건문을 줄이고 코드가 훨씬 깔끔해질 수 있다.
시간 계산에서는 나머지 연산(%)이 매우 유용하다는 것을 다시 한번 느꼈다.
문제를 단순화하는 방향으로 접근하면 디버깅도 쉬워진다.