컴퓨터 공부/📚 Baekjoon(백준)

[백준/알고리즘/python/java] 2852번 - NBA 농구

letzgorats 2023. 11. 16. 14:29

이미지를 누르면 문제 링크를 보실 수 있습니다.
이미지를 누르면 문제 링크를 보실 수 있습니다.

해당 문제는 NBA 농구 경기에서 특정 팀이 얼마나 오랫동안 리드했는지를 계산하는 문제입니다. 이 문제를 풀 때는 득점 순서, 득점 시간, 현재 리드 상태를 정확히 추적하는 것이 중요합니다.

 

문제를 딱 봤을 때, 뭔가 "득점이 성공된 시간 순서"대로 "1팀과 2팀 중에 어떤 팀이 넣었는지" 알아야 할 것 같습니다. 그리고, 득점을 함으로써 앞서가는지 혹은 동점이 됐는지도 체크"해야 하는 것이 중요합니다. 동점이 된 순간부터는 어느 팀도 리드하지 않는 상태가 되기 때문입니다.

 

이렇게, 주의할 점은 아래와 같이 요약할 수 있겠습니다.

  1. 경기 시간 처리 : 경기 시간은 "시:분" 형식으로 주어지며, 이를 총 분으로 변환해야 합니다.
  2. 상태 관리 : 경기의 현재 상태(동점, 팀1 리드, 팀2 리드)를 추적해야 합니다.
  3. 경기 종료 시간 처리 : 경기가 끝날 때 까지 지속된 리드 시간을 정확히 계산해야 합니다.

 

풀이는 코드를 바탕으로 설명드리겠습니다.

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' 메소드의 활용은 파이썬에서 출력 형식을 제어하는 데 매우 유용합니다.

특히, 시간, 날짜 등을 정형화된 형식으로 출력할 때 자주 사용되는 기법입니다.

반응형