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