- 문제 : https://www.acmicpc.net/problem/2852

 

문제 이해 

- 1번 팀과 2번 팀이 농구 경기를 하는데, 48분 동안 각 팀이 이기고 있던 시간을 계산하는 문제다. 

 

- 필요한 변수로는 score, time, ans가 있는데 score는 각 점수를 기록하는 거라고 이해가 되지만, time과 ans는 약간의 생각이 필요하다. time은 이기고 있는 팀의 이전 시간을 기록하는 딕셔너리이고, ans는 두 팀이 동점인 경우 시간 기록은 다시 리셋되므로 그때까지 팀에서 이기고 있는 시간을 기록하기 위한 용도로 사용한다. 즉, time은 ans를 만들기 위한 수단이라고 이해했다. 

 

- 한가지 주의해야할 점은 헤맸던 부분이 골을 하나 넣었다고 했을 때 그 팀이 이기는 상황으로 바뀔 수도 있지만, 아닌 경우도 있다. 그래서 이기는 경우를 다른 팀의 점수를 앞질렀을 때부터 시간을 재야 한다. 

    - 그래서 state변수가 필요하다. state가 0인 상황에서는 골을 넣은 팀이 이기는 상황이 되고, 그때 state와 time이 바뀐다. 

    - 만약 state != 0 인 상황에 두 팀의 점수가 동일하게 됐다면 동점인 상황이므로 그때 state는 0이 되고, 그 전까지 이기던 팀의 점수를 카운트(ans[state] += t - time[team]) 해서 기록해야 한다. 

 

- 그리고 시간 계산하는 것도 별도의 라이브러리를 이용해야하는 줄 알았는데, 그럴 필요 없이 처음부터 초로 계산한 다음에 마지막에 분:초로 출력하면된다. 이렇게 하면 풀이가 훨씬 단순해진다. 

 

- 까먹으면 안되는게 마지막 48까지 이기고 있는 팀이 있다면 그거까지 한 번 더 계산해줘야지 정답이 뜬다. 

 

- 그리고 1팀의 이기고 있던 시간과 2팀의 이기고 있던 시간을 순차대로 출력해주면 된다. 

    - ans에 있는 값들은 초 단위 이므로,  60의 몫을 분으로 60의 나머지를 분으로 출력하면 된다. 

    - 다만 시간은 분,초 모두 두자리 수로 표현해야하므로 (1분 30초 같은 경우는 01:30으로 출력) '{:0>2}'를 이용해서 출력하면 된다. 

    - {:0>2} 는 >2와 0으로 분리해 생각할 수 있는데, >2는 왼쪽으로 2칸을 확보하라는 뜻이고 만약 그 두 자리 중에 남는 자리을 때 그 자리를 0으로 채우라는 문법이다. 

 

 

정답 풀이 

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))

 

참고 블로그

https://velog.io/@shin421179/BOJ-2852-NBA-%EB%86%8D%EA%B5%AC

+ Recent posts