- 문제 : 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
'백준 > 구현' 카테고리의 다른 글
[구현/백준] 20006번 : 랭킹전 대기열 (0) | 2023.09.08 |
---|---|
[구현/백준] 1138번 : 한 줄로 서기 (0) | 2023.09.06 |
[구현/백준] 1205번 : 등수 구하기 (0) | 2023.08.29 |
[구현/백준] 9017번 : 크로스 컨트리 (0) | 2023.08.21 |
[구현/백준] 11723번 : 집합 (0) | 2023.08.06 |