자료 구조, 해시를 사용한 집합과 맵, 구현
24학번 신입생 정민이는 밥을 사준다는 선배들의 약속을 모두 메모장에 기록해 둔다. 메모장의 각 줄에는 선배 이름 𝑆, 약속 주차 𝑊, 요일 𝐷, 밥 약속에 드는 비용 𝑃가 기록돼 있다. 선배 이름은 문자열, 나머지는 정수로 기록한다. 또, 한 선배는 두 번 이상 밥을 사주지 않으며 모든 선배의 이름은 다르다.
정민이는 컴퓨터학부답게 요일을 0과 6 사이의 정수로 기록한다. 예를 들어 월요일은 0이고 목요일은 3이다.
정민이의 착한 선배들은 밥을 사줄 수 있는 충분한 돈이 있다면 귀여운 후배와의 밥 약속을 무를 수 없다. 정민이의 기록과 선배들이 지닌 돈을 보고 정민이가 최대 며칠 연속으로 밥을 얻어먹을 수 있는지 구해보자!
첫 번째 줄에는 기록의 수 𝑁이 주어진다. (0≤𝑁≤100)
두 번째 줄부터 𝑁개의 줄에 걸쳐 기록의 정보가 주어진다. 기록의 정보는 𝑆 𝑊 𝐷 𝑃와 같은 형식으로 주어지며, 이는 S𝑆선배가 𝑊주차 𝐷번째 요일에 𝑃원이 필요한 밥 약속을 잡았음을 뜻한다. 기록에 있는 선배의 이름은 모두 정확히 한 번씩만 주어진다. (1≤𝑊≤10;0≤𝐷≤6;0≤𝑃≤100000)
그다음 줄부터 𝑁개의 줄에 걸쳐 앞서 주어진 선배 이름과 선배가 소지한 돈 𝑀이 공백을 사이에 두고 주어진다. 여기서 주어지는 선배 이름의 순서는 앞서 주어진 선배 이름의 순서와 다를 수 있다. 0≤𝑀≤100000)
선배 이름은 12글자 이내의 영어 대소문자로 이뤄진 문자열로 주어진다.
정민이가 최대 며칠 연속으로 밥을 얻어먹을 수 있는지 출력한다.
코드
import sys
input = sys.stdin.readline
n = int(input())
log = {}
for _ in range(n):
name, w, d, p = input().split()
log[name] = [(int(w)-1)*7 + int(d), int(p)] # (주를 일 단위로 변환 + 일, 비용)
data = [0]*7*10 # 10주 * 7일 = 70일
for _ in range(n):
name, p = input().split()
if int(p) - log[name][1] >= 0: # 충분한 돈이 있다면
data[log[name][0]] = True # 해당 날짜를 1로 설정
max_count = 0 # 연속된 1의 최대 개수
current_count = 0 # 현재 연속된 1의 개수
for day in data:
if day:
current_count += 1
else:
max_count = max(max_count, current_count) # 연속이 끝나면 최대값을 갱신
current_count = 0 # 현재 카운트를 초기화
max_count = max(max_count, current_count)
print(max_count)
'알고리즘 > 백준' 카테고리의 다른 글
[Silver II] 한 줄로 서기 - 1138 (python) (0) | 2024.07.05 |
---|---|
[Silver III] 우승자는 누구? - 5179 (python) (0) | 2024.07.05 |
[Silver III] 놀이공원 - 2594 (python) (0) | 2024.07.05 |
[Silver III] NBA 농구 - 2852 (python) (0) | 2024.07.04 |
[Silver I] 트럭 - 13335 (python) (1) | 2024.07.04 |