백준_NBA농구

임정민·2024년 3월 1일
0

알고리즘 문제풀이

목록 보기
169/173
post-thumbnail

백준 실버3 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

https://www.acmicpc.net/problem/2852

[나의 풀이]

⌛ 28분

N = int(input())
score1, lead1 = 0,0
score2, lead2 = 0,0
now = 0

for _ in range(N):
    team, time = map(str,input().split())
    minutes, seconds = list(map(int,time.split(":")))
    time = minutes*60+seconds
    
    if score1>score2:
        lead1 += time-now
    elif score1<score2:    
        lead2 += time-now

    now = time

    if team=='1':
        score1 += 1
    else:
        score2 += 1

if score1>score2:
    lead1 += 48*60-now
elif score1<score2:    
    lead2 += 48*60-now

print(f'{lead1//60:02d}:{lead1%60:02d}')
print(f'{lead2//60:02d}:{lead2%60:02d}')

경기 시간 총 48분의 농구 경기가 진행 되고 득점하는 팀별 득점 시간대(ex) 1 20:00)가 모두 주어질 때, 각 팀별(두 팀) 이기고 있던 시간의 총합을 출력하는 문제입니다.🐤🐤🐤

각 팀별 점수(score1, score2)와 팀별 리드 시간(lead1, lead2) 정의한 뒤, 새로운 득점이 발생할 때마다 현재까지 점수를 비교하여 리드 시간을 누적하고 팀별 점수를 업데이트하는 방식입니다.

구현 포인트로 마지막 득점 발생 후에 리드하는 팀이 있다면, '경기 종료~마지막 득점 발생시간'까지 리드했던 시간을 누적하여야 한다는 점입니다.

[다른 사람의 풀이1]

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

각 팀별 득점(score), 현재까지 리드한 시간(time), 총 리드 시간(ans)을 dict으로 정의하여 구현한 풀이입니다.🐪🐪🐪

새로운 득점이 발생하였을 때 득점 상황을 업데이트 한 뒤, 이전 상황이 비기는 상황이였다면 '현재 시간-이전시간'(새로운 리드 시간,time)을 누적하고

다음 득점 상황에서 비기게 되었을 때, 총 리드 시간(ans)에 누적하는 방식입니다.

이외에 다른 풀이도 모두 유사한 알고리즘이였습니다.

감사합니다.

profile
https://github.com/min731

0개의 댓글