문제
https://www.acmicpc.net/problem/2852
문제
동혁이는 NBA 농구 경기를 즐겨 본다. 동혁이는 골이 들어갈 때 마다 골이 들어간 시간과 팀을 적는 이상한 취미를 가지고 있다.
농구 경기는 정확히 48분동안 진행된다. 각 팀이 몇 분동안 이기고 있었는지 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 골이 들어간 횟수 N(1<=N<=100)이 주어진다. 둘째 줄부터 N개의 줄에 득점 정보가 주어진다. 득점 정보는 득점한 팀의 번호와 득점한 시간으로 이루어져 있다. 팀 번호는 1 또는 2이다. 득점한 시간은 MM:SS(분:초) 형식이며, 분과 초가 한자리 일 경우 첫째자리가 0이다. 분은 0보다 크거나 같고, 47보다 작거나 같으며, 초는 0보다 크거나 같고, 59보다 작거나 같다. 득점 시간이 겹치는 경우는 없다.
출력
첫째 줄에 1번 팀이 이기고 있던 시간, 둘째 줄에 2번 팀이 이기고 있던 시간을 출력한다. 시간은 입력과 같은 형식(MM:SS)으로 출력한다.
Algorithm
'지금 이기고 있는 팀' 과 '승패가 바뀌었을 때의 시간'을 저장하는 변수 winteam, wintime을 선언한다.
또한 팀별로 점수와, 시간을 저장해 비교해야 하므로 teamgoal, timedict 딕셔너리 자료형을 선언한다.
이 문제의 쟁점은, 비긴 상태를 어떻게 처리하느냐이다.
기본적인 로직은 매 순간 골을 넣어서 이긴 팀을 winteam, 그때의 시간을 wintime으로 지정하고
winteam의 점수보다 입력된 team의 점수가 더 높다면, 그때까지의 시간을 딕셔너리에 저장하고 winteam을 team으로 갱신한다.
이렇게 하면 승패가 변하는 시점까지의 시간을 저장할 수 있다.
단, 비기는 경우와 처음의 경우를 잘 지정해야 한다.
처음도 비긴 상태이므로, winteam을 0으로 지정하고 다시 비기는 경우에만 winteam을 0으로 설정했다.
단, 그렇게 될 경우 '비긴 상태에서의 시간'도 wintime에 포함될 수 있기 때문에 예외 조건을 걸어야 한다.
많은 시행착오를 했는데, 확실히 변수의 값을 추적해보며 로그를 찍어 허점을 파악하는 방법이 제일 빨랐던 것 같다.
Code
input = __import__('sys').stdin.readline
winteam = '0'
wintime = 0
timedict = {'0':0,'1':0,'2':0}
teamgoal = {'0':0,'1':0,'2':0}
n = int(input())
for i in range(n):
team, time = input().rstrip().split()
teamgoal[team] += 1 # 골을 넣은 횟수를 적립.
#print(f"{i}번째 시행 : 골을 넣은 팀은 {team}")
#print(teamgoal)
if (teamgoal[team] > teamgoal[winteam]) : # 골을 넣어서 이기는 팀이 바뀔 경우
# time - wintime을 하기 위해, 초로 변환 -> 그 다음 작업을 거침.
m1,s1 = map(int,time.split(":"))
time_s = m1 * 60 + s1
#초로 변환한 시간 - 이기기 시작했던 시간초. 시간이 역행하는 경우는 존재하지 않으므로 이렇게 해도 될듯? 첫번째 경우만 제외.
if (winteam != '0'):
timedict[winteam] += (time_s - wintime)
#wintime과 winteam에 대한 정의를 바꿔야 함.
winteam = team
wintime = time_s #이겼을 당시의 시간.
#print(f"{i}번째에 추월함. 이때의 이긴 팀은 {winteam} 이겼을 때의 시간은 {wintime}")
#print(timedict.items())
elif (teamgoal['1'] == teamgoal['2']) : #비기는 경우에는, winteam과 wintime의 기록만 끊어주어야 함.
m1,s1 = map(int,time.split(":"))
time_s = m1 * 60 + s1
timedict[winteam] += (time_s - wintime)
#winteam을 건들면 안됨 아마도?
winteam = "0"
wintime = time_s
#print(f"비겨버렸어. 비겼을 때의 시간은 {wintime}")
if (i == n-1): #마지막 골의 경우는, 남아있는 wintime과 winteam을 계산해줘야 함
timedict[winteam] += (48*60 - wintime)
for i, item in enumerate(timedict.values()):
if (i == 0 ): continue
m = item // 60
s = item % 60
print(f"{m:02d}:{s:02d}")
'Koala - 17기 > 코딩테스트 기초 스터디' 카테고리의 다른 글
[백준/Python] 12840번 창용이의 시계 (0) | 2025.02.23 |
---|---|
[백준/C++] 2630번: 색종이 만들기 (0) | 2025.02.23 |
[백준/C++]1759번: 암호 만들기 (0) | 2025.02.16 |
[백준/C++]7795번 먹을 것인가 먹힐 것인가 (0) | 2025.02.09 |
[백준/Python] 15905: 스텔라(STELLA)가 치킨을 선물했어요 (0) | 2025.02.09 |