CodingTest/Baekjoon

Baekjoon 2853 | NBA 농구 (Python)

tmdrn9 2025. 2. 19. 15:26

📌문제

SILVER3 / 구현 / 문자열

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

 

📌문제 분석 및 설계

문제를 봤을 때,

[시간을 나타내는 방법, 이긴 시간 계산 방법, 마지막 턴은 예외 처리(48분에서 뺄셈), 출력 형식]이 핵심이라고 생각했다.

 

1. 분:초 로 나타내는것을 초로 바꿔서 문제를 단순화

2. 득점 시간 별로 우위를 점한 팀 기록(동점일때는 0으로 기록)한 후에 해당 기록들을 순회하며 이긴 시간 누적 합산

3. 마지막 득점일때 체크해서 48분에서 빼주기

4. 포맷팅을 사용해서 출력형식 맞추기

 

사실 4번의 경우에는 필자는 포맷팅이 생각이 안 나서 아래와 같이 인라인 if-else문을 사용했다. 하지만 포맷팅을 사용하는 순간 가독성도 코드길이도 간결해지니까 포맷팅 기억하기. (포맷팅 참고링크: https://dojang.io/mod/page/view.php?id=2300 )

또한 divmod를 사용하지 않고, %,//사용해도 무관하나 이 역시 가독성을 위해.

#divmod 사용x
mm1=winTime[1]//60
ss1=winTime[1]%60
mm2=winTime[2]//60
ss2=winTime[2]%60

#divmod 사용o
mm1,ss1=divmod(winTime[1], 60)
mm2,ss2=divmod(winTime[2], 60)

#포맷팅 사용x
mm1= '0'+str(mm1) if mm1<=9 else mm1
ss1= '0'+str(ss1) if ss1<=9 else ss1
mm2= '0'+str(mm2) if mm2<=9 else mm2
ss2= '0'+str(ss2) if ss2<=9 else ss2

#포맷팅 사용o
print(f'{mm1:02d}:{ss1:02d}')
print(f'{mm2:02d}:{ss2:02d}')

 

📌소스 코드

n=int(input())
score1,score2=0,0
record=[]
for i in range(n):
    t,time=input().split()
    mm,ss=map(int,time.split(':'))
    time=mm*60+ss
    if t=='1':
        score1+=1
    else:
        score2+=1

    if score1>score2:
        record.append((time,1))
    elif score2>score1:
        record.append((time,2))
    else:
        record.append((time,0))

winTime={1:0,2:0}
for i,(s,t) in enumerate(record):
    if t==0:
        continue
    if i==n-1 and s!=0:
        winTime[t]+=(48*60)-s
    else:
        winTime[t]+=record[i+1][0]-s

mm1,ss1=divmod(winTime[1], 60)
mm2,ss2=divmod(winTime[2], 60)

print(f'{mm1:02d}:{ss1:02d}')
print(f'{mm2:02d}:{ss2:02d}')