본문 바로가기

알고리즘

프로그래머스)주차 요금 계산-python

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

import datetime
import math

def solution(fees, records):
    answer = []
    dic={}
    dic2={}
    arr = []
    for i in range(len(records)):
        a = list(records[i].split())
        
        if a[1] not in dic:
            dic[a[1]] = [a[0],a[2]]
        else:
            if a[2] == 'OUT':
                hm = dic[a[1]][0].split(':')
                hm2 = a[0].split(':')
                
                date1 = datetime.timedelta(hours= int(hm[0]) , minutes=int(hm[1]))
                date2 = datetime.timedelta(hours= int(hm2[0]) , minutes=int(hm2[1]))
                
                minus = date2 - date1
                arr.append([a[1],minus])
                dic[a[1]] = [a[0],a[2]]
            else:
                dic[a[1]] = [a[0],a[2]]

    for key,value in dic.items():
        if value[1] == 'IN':
            h = value[0].split(":")
                
            date2 = datetime.timedelta(hours= 23 , minutes=59)
            date1 = datetime.timedelta(hours= int(h[0]) , minutes=int(h[1]))
            minus = date2 - date1
            arr.append([key,minus])
    for i in range(len(arr)):
        if arr[i][0] not in dic2:
            dic2[arr[i][0]] = arr[i][1]
        else:
            dic2[arr[i][0]] = dic2[arr[i][0]] + arr[i][1]
    
    new_dic = dict(sorted(dic2.items()))
    for key,value in new_dic.items():
        h = str(value).split(':')
        tim = (int(h[0]) * 60) + int(h[1])
        mt = tim - fees[0]
        print(mt)
        if mt <= 0:
            answer.append(fees[1])
        else:
            q = math.ceil(mt / fees[2]) * fees[3]
            q += fees[1]
            answer.append(q)
        
    return answer

문제 이해도 쉬웠고 복잡한 계산도 없었기에 해당 문제는 모듈만 잘 활용하면 쉽게 풀릴 수 있는 문제같았다.

그러나 내가 제출한 코드는 for문을 여러번 사용했었다.

시간초과나 그런건 일어나지 않았지만

records를 딕셔너리에 저장하는 for문 하나.

dic에 저장된 것들 중 OUT이 아닌 IN이 되어있는 것을 체크하는 for문 하나.

그리고 정렬까지..

그리고 총 시간 계산 까지 총 세개의 for문이 사용되었다.

 

남들이 제출한 코드가 궁금해서 한 번 검색해보았더니 

 

def solution(fees, records):
    answer = []

    # 기본 시간, 기본 요금, 단위 시간, 단위 요금 순
    dt, df, ut, uf = fees
    
    dic = dict()

    for r in records:
        time, number, history = r.split()
        number = int(number)
        
        if number in dic:
            dic[number].append([dateToMinutes(time), history])
        else:
            dic[number] = [[dateToMinutes(time), history]]
    
    rList = list(dic.items())
    rList.sort(key=lambda x : x[0])
    
    for r in rList:
        t = 0

        for rr in r[1]:
            if rr[1] == "IN":
                t -= rr[0]
            else:
                t += rr[0]

        if r[1][-1][1] == "IN":
            t += dateToMinutes('23:59')
        
        if t <= dt:
            answer.append(df)
        else:
            answer.append(df + math.ceil((t-dt) / ut) * uf)        

    return answer

별 다를 것은 없었지만 확실히 내 코드보다 간결하고 실행시간이 짧아보이긴 한다.