알고리즘/백준

[Silver III] 선배님 밥 사주세요! - 31869 (python)

KimMinGyun 2024. 7. 5. 00:55

문제 링크

 

 

분류

자료 구조, 해시를 사용한 집합과 맵, 구현

 

문제 설명

24학번 신입생 정민이는 밥을 사준다는 선배들의 약속을 모두 메모장에 기록해 둔다. 메모장의 각 줄에는 선배 이름 𝑆, 약속 주차 𝑊, 요일 𝐷, 밥 약속에 드는 비용 𝑃가 기록돼 있다. 선배 이름은 문자열, 나머지는 정수로 기록한다. 또, 한 선배는 두 번 이상 밥을 사주지 않으며 모든 선배의 이름은 다르다.

정민이는 컴퓨터학부답게 요일을 06 사이의 정수로 기록한다. 예를 들어 월요일은 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)