https://www.acmicpc.net/problem/2852
문제풀이
전체적인 솔루션은 점수가 나는 순간, 이전에 점수 난 시점과의 시간 차이를 계산하며, 그 동안 점수가 높았던 팀에 저장하는 식으로 진행된다. 점수가 같은 경우, 시간 차이는 필요 없으므로 계산하지 않음으로써, 연산 최적화를 수행하였다. 추가적으로 신경 쓴 포인트는 다음과 같다.
- 마지막 시간인 48분이 입력으로 들어오지 않으므로, 하드 코딩 해주어야 한다.
- Iteration을 N+1로 설정해주어, 마지막 Iteration에서 input() 대신 직접 "? 48:00"을 대입한다.
- Winner를 의미하는 ?는 다음 Iteration에서 활용하는데, 마지막 Iteration이라 활용하지 않는다. 그래서 입력 포맷을 맞춰주기 위해 아무 값이나 넣어주면 된다.
- 뺄셈을 통해, 시간 차이를 구할 때, 초부터 구해준다. 자리내림을 고려한 것이다. 현재의 초가 과거의 초보다 작을 경우, 자리내림이 발생한다.
- 자리 내림이 발생했을 경우, 초에 60을 더해준다.
- 자리 내림이 발생했을 경우, 분에 1을 빼준다.
- 그 동안의 우승자가 중요하므로, 시간을 더해준 뒤 마지막에 현재의 우승자를 반영해준다.
- 더해진 시간 차이는 덧셈만 이뤄지므로 모두 더해준 뒤, 마지막에 넘어가는 초를 분으로 변환해주었다.
문제코드
N = int(input())
team1_score, team2_score = 0, 0
team1_minutes, team1_seconds = 0, 0
team2_minutes, team2_seconds = 0, 0
prev_minutes, prev_seconds = 0, 0
for idx in range(N + 1):
if idx != N:
winner, time = input().split()
elif idx == N:
winner, time = "1 48:00".split()
current_minutes, current_seconds = map(int, time.split(":"))
if team1_score != team2_score:
delta_seconds = (current_seconds - prev_seconds) if current_seconds >= prev_seconds else (current_seconds - prev_seconds) + 60
delta_minutes = (current_minutes - prev_minutes) if current_seconds >= prev_seconds else (current_minutes - prev_minutes) - 1
if team1_score > team2_score:
team1_minutes += delta_minutes
team1_seconds += delta_seconds
elif team1_score < team2_score:
team2_minutes += delta_minutes
team2_seconds += delta_seconds
prev_seconds = current_seconds
prev_minutes = current_minutes
if winner == "1":
team1_score += 1
elif winner == "2":
team2_score += 1
def solution(minutes, seconds):
total_minutes = minutes + seconds // 60
remaining_seconds = seconds % 60
print(f"{total_minutes:02}:{remaining_seconds:02}")
solution(team1_minutes, team1_seconds)
solution(team2_minutes, team2_seconds)