프로그래머스 - 주차 요금 계산(2022 KAKAO BLIND RECRUITMENT)

Beomsun·2022년 3월 11일
0

algorithm

목록 보기
23/35

프로그래머스 - 주차 요금 계산(2022 KAKAO BLIND RECRUITMENT)

https://programmers.co.kr/learn/courses/30/lessons/92341

간단했다. db를 사용한다고 가정하고 풀이했다. 우선 모든 입차, 출차 시간을 분으로 변경해 준다 key값을 set으로 중복을 제거해서 저장한다. 이 후 차량 번호를 key값으로 입차, 출차에 대한 시간을 저장한다.
또한 key를 차량번호로 하는 IN, OUT에 대한 기록을 저장하는 map을 하나 더 생성해서 마지막 입차, 출차를 기록한다. key에 해당하는 IN, OUT에 대한 히스토리를
찾아서 만약 출차(OUT)에 대한 기록이 없다면 23:59분에 출차된 것으로 간주 한다. 시간이 기록된 db에 23:59의 값을 분으로 변경하고 db에 추가한다. 이제 시간은 모두 저장됐으니 요금을 구하면 된다.

위에 과정이 완료되면 key를 오름차순으로 정렬해주고 시간이 저장된 db에는 입차가 있으면 반드시 출차가 있다. 즉 0번 인덱스는 입차 1번인덱스는 출차이다. 짝수는 입차이고 홀수는 출차이다.
이를 통해 누적 주차 시간을 계산해준다. 이 후 누적 주차 시간이 기본 시간이하라면, 기본 요금을 청구하고 아니면 요금을 계산한다. 계산 할 때 주의 할 점이 초과한 시간이 단위 시간으로 나누어 떨어지지 않으면, 올림해야한다.

초과한 시간 = (누적 주차시간 - 기본시간) // 단위 시간(분)

주어진 계산 로직으로 계산을 수행하고 answer에 담으면 정답이 된다.

from collections import defaultdict
def solution(fees, records):
    answer = []
    # 공백기준으로 문자열 나눈 후 key는 2번째 인덱스
    db = defaultdict(list)
    history_db = defaultdict(list)
    tmp_key = set()
    for record in records:
        data = record.split(" ")
        # 시각을 분으로 변경하자
        time = data[0]
        time = time.split(":")
        time = (int(time[0]) * 60)+ int(time[1])  
        key = data[1]
        tmp_key.add(key)
        # IN - 입차, OUT - 출차
        history = data[2]
        history_db[key] = data[2]
        db[key].append(time)
    
    #내역에서 마지막 출차 기록이 없다면
    # 23:59에 출차된 것으로 간주 1439분
    for k in tmp_key:
        if history_db.get(k) == 'IN':
            db[k].append(1439)
    tmp_key = sorted(tmp_key)
    ## 요금계산
    # fees[0] 기본 시간(분), [1] 기본 요금(원), [2] 단위 시간(분), [3] 단위 요금(원)
    for k in tmp_key:
        tmp = 0
        for idx,data in enumerate(db.get(k)):
            if idx % 2 == 0:
                tmp+=data
            else:
                tmp-=data
        tmp_time = abs(tmp)
        print(tmp_time)
        parking_fee = 0
        # 누적 주차 시간이 기본 시간이하라면, 기본 요금을 청구합니다
        if tmp_time > fees[0]:
            # 나누어 떨어지지않으면 올림
            tmp_mod = (tmp_time - fees[0]) % fees[2]
            tmp_div = (tmp_time - fees[0]) // fees[2]
            tmp_time = tmp_div
            if tmp_mod !=0:
                tmp_time+=1
            parking_fee = fees[1] + (tmp_time * fees[3])
            answer.append(parking_fee)
        else:
            parking_fee = fees[1]
            answer.append(parking_fee)
    return answer

0개의 댓글

관련 채용 정보