BOJ 2852 NBA 농구

신현철·2022년 3월 18일
1

BOJ

목록 보기
2/9

2852번: NBA 농구

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}까지 처리해주었다.

profile
전국 DBA 랭킹 2000등(정원 2000명 중에)

2개의 댓글

comment-user-thumbnail
2023년 2월 15일

와 이 문제 다른 코드들 봐도 이해도 안 됐는데 깔끔하게 정말 잘 짜셨네요 ㄷㄷ 감탄하고 갑니당

1개의 답글