사용한 자료구조 및 개념 : defaultdict
💡 문제풀이 아이디어 및 어려웠던 점
💫 아이디어
1️⃣ 딕셔너리를 대여장으로 활용한다.
2️⃣ defaultdict를 사용한다.
✅ defaultdict란?
- defaultdict는 모든 키를 확인할 필요가 없습니다.
- defaultdict는, value를 지정하지 않은 key의 value를 0으로 가집니다.
👻 어려웠던 점
🚨 defaultdict 사용법 미숙
rental = defaultdict(defaultdict)
: 중첩된 defaultdict 구조를 생성
→ 이름 별로 대여한 부품을 기록하기 위해서이다.
{
'JAMES': {
'BIKE': "12:00"
}
}
penalty = defaultdict(int)
: int()를 호출하면 0이 반환된다. 따라서 defaultdict(int)는 딕셔너리에 없는 키에 접근하려 할 때 그 키의 기본값으로 0을 설정한다.
→ 각 사람에게 벌금을 더할 때 유용하다.
penalty['JAMES'] += 50
‘JAMES’라는 이름으로 된 키가 penalty 딕셔너리에 존재하지 않더라도, defaultdict 때문에 자동으로 ‘JAMES’의 값이 0으로 초기화 된 후, 50이 더해져서 50으로 설정된다.
Solution Code & 주석
from collections import defaultdict
# 일반 dict와 비슷하지만, 키가 존재하지 않을 경우 미리 지정된 기본 값을 가지는 딕셔너리이다.
import sys
input = sys.stdin.readline
month_to_day = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]
# 각 월의 시작일부터 그 월의 마지막일까지의 누적 날짜이다.
# 시간 정보를 분 단위로 변환하기 위해서 미리 리스트로 설정해놓는다.
# 주어진 월, 일, 시간, 분 모두 분으로 바꾸어준다.
def change_minute(month, day, hour, minute):
return (month_to_day[month - 1] + day) * 1440 + hour * 60 + minute
# N = 대여장 기록 수, l = 대여 기간, f = 시간 초과시 패널티
N, l, f = input().split()
F = int(f)
L = change_minute(1, int(l[:3]), int(l[4:6]), int(l[7:9]))
rental = defaultdict(defaultdict) # 각 사람별로 대여한 부품과 시간 저장
penalty = defaultdict(int) # 벌금 기록 딕셔너
for _ in range(int(N)):
data = input().strip()
minute = change_minute(
int(data[5:7]), int(data[8:10]), int(data[11:13]), int(data[14:16])
) # 기록의 날짜 시간을 분으로 변환
part, name = data[17:].split() # 대여/반납한 부품과 사람 저장
# 내 이름의 대여기록에 부품이 있으면 대여했다는 뜻이므로 반납처리를 하고 벌금을 계산한다.
if part in rental[name]:
overtime = minute - rental[name][part] - L
if overtime > 0:
penalty[name] += F * overtime
del rental[name][part]
# 기록이 없다면 대여를 한다는 뜻이므로 딕셔너리에 기록을 저장한다.
else:
rental[name][part] = minute
# 벌금있는 사람이 있으면 출력하고 없으면 -1을 출력한다.
if penalty:
for name in sorted(penalty):
print(name, penalty[name])
else:
print(-1)
'💡Algorithm > python' 카테고리의 다른 글
[python]1260_DFS와 BFS (0) | 2023.09.07 |
---|---|
[python]2060_바이러스 (0) | 2023.09.06 |
[python]2696_중앙값 구하기 (0) | 2023.08.23 |
[python]11286_절대값 힙 (0) | 2023.08.11 |
[python]4385_생태학 (0) | 2023.08.09 |