https://school.programmers.co.kr/learn/courses/30/lessons/92341
풀이
조건에 맞춰서 차근차근 구현만 하면 되는 문제였다.
파이썬 내 올림 기능을 지원하는 메소드가 math.ceil 인데 실수로 반올림하는 round() 메서드를 썼다... 주의하자!
먼저 수도코드로 쭉 작성한 뒤 구현했고, 바로 통과됬다.
1. records 내 값을 공백 기준으로 split해서 time, car_num, inout에 넣기
2. 딕셔너리에 car_num을 키로 time 넣어주기. 각 딕셔너리 value값은 배열. (in, out 순서로 들어간다)
* 만약 배열 길이가 홀수면 출차 내역이 입력되지 않은 요소이므로 23:59를 직접 넣어준다
3. records 배열 순회가 끝나면 딕셔너리를 살펴보면서 시간을 계산한다.
- [짝수] : IN / [홀수] : OUT 이므로 홀수 - 짝수 해주면 된다.
인자를 받아올 때 ":"를 기준으로 hour, min을 쪼개주었다.
시간은 상관없는데 분은 음수값이 나왔을 때 예외처리를 해주자. (hour -= 1, min += 60)
4. 총 누적시간이 기본 시간을 넘는다면 문제 조건대로 계산하고, 넘지 않는다면 기본 요금을 저장한다.
* 여기에서 문제 조건 상 차량번호가 작은 요소부터 출력해달라고 했으므로 [차량번호, 요금] 을 저장하는 배열을 만들어준 뒤 차량번호를 기준으로 정렬한 뒤 요금값을 차례대로 answer에 넣어주자.
python 코드
import math
def solution(fees, records):
carnum_fee = [] # (차량번호, 요금) 순 저장
car_dict = {}
for r in records:
time, car_num, inout = r.split(" ")
if car_num in car_dict:
car_dict[car_num].append(time)
else:
car_dict[car_num] = [time]
for k in car_dict.keys():
# 출차 기록이 없는 경우
if len(car_dict[k]) % 2 != 0:
car_dict[k].append("23:59")
# 시간 계산
total_time = 0
for i in range(0, len(car_dict[k]), 2):
# OUT : i+1, IN : i
out_h, out_m = map(int,car_dict[k][i+1].split(":"))
in_h, in_m = map(int, car_dict[k][i].split(":"))
hour = out_h - in_h
minute = out_m - in_m
if minute < 0:
hour -= 1
minute += 60
total_time += hour * 60 + minute
# 요금 계산
if total_time > fees[0]:
carnum_fee.append([k, fees[1] + math.ceil((total_time-fees[0]) / fees[2]) * fees[3]])
else:
carnum_fee.append([k, fees[1]])
carnum_fee.sort(key = lambda x : x[0])
answer = [v[1] for v in carnum_fee]
return answer
'Algorithm > 프로그래머스' 카테고리의 다른 글
[2022 KAKAO BLIND RECRUITMENT] 양궁대회 (1) | 2022.09.21 |
---|---|
[2022 KAKAO BLIND RECRUITMENT] k진수에서 소수 개수 구하기 (0) | 2022.09.20 |
[2022 KAKAO TECH INTERNSHIP] 두 큐 합 같게 만들기 (1) | 2022.09.20 |
[2022 KAKAO TECH INTERNSHIP] 성격 유형 검사하기 (0) | 2022.09.20 |
[프로그래머스] Lv2 - 후보키 (python) (0) | 2022.07.24 |