본문 바로가기
💡Algorithm/python

[python]21942_부품 대여장

by haegomm 2023. 9. 5.

사용한 자료구조 및 개념 : 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