1,2 팀이 각각 득점한 시간이 주어지고 각 팀이 스코어를 리드하고 있었던 총 시간을 mm:ss형태로 출력하는 문제이다.
import sys
input = sys.stdin.readline
n = int(input())
score = {1: 0, 2: 0}
time = {1: 0, 2: 0}
ans = {1: 0, 2: 0}
state = 0 # 0 even, 1 team1 leads, 2 team2 leads
for _ in range(n):
team, t = input().split()
team = int(team)
m, s = map(int, t.split(':'))
t = m*60+s
score[team] += 1
if state == 0:
time[team] = t
state = team
elif state != 0 and score[1] == score[2]:
ans[state] += t-time[state]
state = 0
if state != 0:
ans[state] += 60*48-time[state]
print('{:0>2}:{:0>2}'.format(ans[1]//60, ans[1] % 60))
print('{:0>2}:{:0>2}'.format(ans[2]//60, ans[2] % 60))
state라는 변수로 동점, 1팀 리드, 2팀 리드의 상태를 기억해놓는다.
x팀의 리드상황에서의 x팀의 득점시에는 처리하지 않아도 된다. 동점 -> 리드 혹은 리드 -> 동점 상황만 처리해주면 된다. if문의 불필요한 반복을 피하기위해 각 팀의 점수, 리드시작 시간, 총 리드시간을 딕셔너리로 보관했다.
핵심 풀이는 다음과 같다.
1) 동점에서 특정 팀 리드로 바뀐 경우에는 리드 시작 시간을 넣어주고, state를 리드하는 팀으로 바꿔준다.
2) 리드 상황에서 동점이 된 경우는 누적합에 (입력받은 득점 시간)-(기록해놓은 리드시작 시간)을 더해주고 state를 동점으로 바꿔준다.
3) 입력이 끝나고도 특정 팀이 리드 중이라면 해당 팀 누적합에 (전체 경기시간)-(기록해놓은 리드시작 시간)을 더해준다.
mm:ss 형식이지만 불필요한 계산을 줄이기 위해서 초단위로 계산하고 출력 때에만 연산을 통해 바꿔서 출력했다.
mm:ss 형식의 출력을 위해서 format을 사용했고, 0으로 빈자리를 채우기 위해서 {:0>2}까지 처리해주었다.
와 이 문제 다른 코드들 봐도 이해도 안 됐는데 깔끔하게 정말 잘 짜셨네요 ㄷㄷ 감탄하고 갑니당