해당 문제는 NBA 농구 경기에서 특정 팀이 얼마나 오랫동안 리드했는지를 계산하는 문제입니다. 이 문제를 풀 때는 득점 순서, 득점 시간, 현재 리드 상태를 정확히 추적하는 것이 중요합니다.
문제를 딱 봤을 때, 뭔가 "득점이 성공된 시간 순서"대로 "1팀과 2팀 중에 어떤 팀이 넣었는지" 알아야 할 것 같습니다. 그리고, 득점을 함으로써 앞서가는지 혹은 동점이 됐는지도 체크"해야 하는 것이 중요합니다. 동점이 된 순간부터는 어느 팀도 리드하지 않는 상태가 되기 때문입니다.
이렇게, 주의할 점은 아래와 같이 요약할 수 있겠습니다.
- 경기 시간 처리 : 경기 시간은 "시:분" 형식으로 주어지며, 이를 총 분으로 변환해야 합니다.
- 상태 관리 : 경기의 현재 상태(동점, 팀1 리드, 팀2 리드)를 추적해야 합니다.
- 경기 종료 시간 처리 : 경기가 끝날 때 까지 지속된 리드 시간을 정확히 계산해야 합니다.
풀이는 코드를 바탕으로 설명드리겠습니다.
import sys
input = sys.stdin.readline
N = int(input())
score = {1:0, 2:0} # 각 팀마다 득점 점수 저장 (1골당 1점)
times = {1:0, 2:0} # 각 팀마다 득점한 시간 저장
state = 0 # 현재 상태 저장 ( 0 : 비기는 중, 1: 1팀 리드, 2: 2팀 리드)
answer = {1:0, 2:0} # 각 팀마다 리드했던 시간 저장
for _ in range(N):
team, t = input().strip().split()
team = int(team)
h, m = t.split(":")
t = int(h) * 60 + int(m) # 시간을 분으로 변환
score[team] += 1 # 현재 바라보고 있는 팀에 + 1점
if state == 0: # 현재 비기고 있는데, 득점이 들어갔다면
times[team] = t # 해당 팀에 현재 바라보고 있는 득점시간 저장
state = team # 상태를 현재 바라보고 있는 팀이 리드 중인 것으로 변경
elif state != 0 and score[1] == score[2]: # 현재 득점을 함으로써 비기게 됐다면,
# 현재 득점시간에서 바라보고 있는 팀의 이전 득점시간을 빼주고 answer에 저장
answer[state] += (t - times[state])
state = 0 # 상태를 비기는 상태인 0으로 변경
if state != 0: # 현재 비기고 있는 상태로 끝난게 아니라면, 경기가 끝날 때까지 현재 리드한 팀이 계속 리드
answer[state] += 2880 - times[state] # 해당 시간 계산
print("{:0>2}:{:0>2}".format(answer[1] // 60, answer[1] % 60))
print("{:0>2}:{:0>2}".format(answer[2] // 60, answer[2] % 60))
주석으로, 해당 코드에 대한 설명을 적어놨습니다. 해당 문제는 다양한 방법으로 풀 수가 있는데, 저는 딕셔너리를 활용해서 해당 팀의 득점상황과 시간등을 계산했습니다.
마지막으로, 답을 출력하는 과정에서 쓰이는 문법을 설명드리겠습니다.
print("{:0>2}:{:0>2}".format(answer[1] // 60, answer[1] % 60))
print("{:0>2}:{:0>2}".format(answer[2] // 60, answer[2] % 60))
이 부분은 각 팀이 리드한 시간을 "시 : 분"형태로 출력하는 데 사용됩니다. 여기서 사용된 문법은 파이썬의 문자열 형식 지정과 'format' 메소드에 관련된 것입니다.
- 문자열 형식 지정 -
- {}는 format 메소드에 의해 채워질 부분을 나타냅니다.
- :0>2는 형식 지정자입니다.
- :은 형식 지정자의 시작을 나타냅니다.
- 0은 빈 공간을 '0'으로 채우라는 의미입니다.
- >는 오른쪽 정렬을 의미합니다.
- 2는 최소 너비를 2자리로 하라는 의미입니다.
이 형식 지정은 한 자리 숫자일 경우 앞에 '0'을 붙여 두 자리로 만들어주는 역할을 합니다. 예를 들어, 5는 05로 출력됩니다.
- 'format' 메소드 -
- format 메소드는 괄호 안의 값을 순서대로 {}에 채워넣습니다.
- 여기서는 answer[1] // 60 (팀 1의 리드 시간의 '시' 부분)과 answer[1] % 60 (팀 1의 리드 시간의 '분' 부분)을 첫 번째와 두 번째 {}에 각각 채워넣습니다.
- 동일한 방식으로 팀 2의 리드 시간도 출력됩니다.
이와 같이 문자열 형식 지정과 'format' 메소드의 활용은 파이썬에서 출력 형식을 제어하는 데 매우 유용합니다.
특히, 시간, 날짜 등을 정형화된 형식으로 출력할 때 자주 사용되는 기법입니다.
'컴퓨터 공부 > 📚 Baekjoon(백준)' 카테고리의 다른 글
[백준/알고리즘/python/java] 2636번 - 치즈 (2) | 2023.11.21 |
---|---|
[백준/알고리즘/python/java] 14502번 - 연구소 (4) | 2023.11.21 |
[백준/알고리즘/python/java] 14499번 - 주사위 굴리기 (2) | 2022.12.12 |
[백준/알고리즘/python/java] 1976번 - 여행 계획 (0) | 2022.12.11 |
[백준/알고리즘/python/java] 2309번 - 일곱 난쟁이 (0) | 2022.09.27 |