코딩테스트

[파이썬(python)] 2022 카카오 블라인드 공채 주차 요금 계산

고후 2022. 3. 9. 18:09

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

 

코딩테스트 연습 - 주차 요금 계산

[180, 5000, 10, 600] ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] [14600, 34400, 5000]

programmers.co.kr

풀었지만 복잡하게 푼 문제.. 조금 간단히 풀 방법을 찾아봐야겠다.

 

처음 작성한 코드

 

from datetime import datetime

def solution(fees, records):
    answer = []
    car_records = [] #차량별로 번호, 입차, 출차 시간
    car = [] #차량 번호, 누적 주차시간
    carnum = []
    
    for str in records:
        hour, num, inout = str.split()
        if inout == 'IN':
            car_records.append([num, hour, ''])
        else:
            for i in range(len(car_records)):
                if car_records[i][0] == num and not car_records[i][2]:
                    car_records[i][2] = hour
        
        if num in carnum:
            continue
        carnum.append(num)
    
    
    for i in range(len(car_records)):
        if not car_records[i][2]:
            car_records[i][2] = '23:59'
    
    car_records.sort(key = lambda x : x[0])
    carnum.sort()
    
    for i in range(len(car_records)):
        exist = False
        tin = datetime.strptime(car_records[i][1],"%H:%M")
        tout = datetime.strptime(car_records[i][2], "%H:%M")
        for j in range(len(car)):
            if car[j][0] == car_records[i][0]:
                car[j][1] += (tout - tin).seconds//60
                exist = True
                continue
        if exist == False:
            car.append([car_records[i][0], (tout - tin).seconds//60])
        
    
    
    
    for i in range(len(car)):
        if car[i][1] <= fees[0]:
            answer.append(fees[1])
            continue
        q, r = divmod((car[i][1]-fees[0]), fees[2])
        if r == 0:
            answer.append(fees[1] + q*fees[3])
            continue
        q += 1
        answer.append(fees[1]+q*fees[3])
        
    
        
    return answer

 

수정한 코드

차량별로 입차시간과 출차시간을 저장해두던 것을

입차 시간만 일시적으로 저장해둔다음에

차량이 출차할 때 입차시간과의 차이를 이용해서 주차시간을 더해주는 방법으로 바꿔봤다.

 

from datetime import datetime

def solution(fees, records):
    
    car = {} #차량 번호, 누적 주차시간
    car_in = {} #차량 번호, 입차 시간 일시적으로 저장
    answer = []
    
    for r in records:
        if r.split()[1] not in car:
            car[r.split()[1]] = 0
            car_in[r.split()[1]] = ''
    
    n = len(car)
    
    for r in records:
        if r.split()[2] == "IN":
            car_in[r.split()[1]] = r.split()[0]
        else:
            tin = datetime.strptime(car_in[r.split()[1]],"%H:%M")
            tout = datetime.strptime(r.split()[0], "%H:%M")
            car[r.split()[1]] += (tout - tin).seconds//60
            
            car_in[r.split()[1]] = '' #입차 시간 초기화
    
    for key in car_in:
        if car_in[key] != '':
            #나간 시간이 나오지 않으면
            tin = datetime.strptime(car_in[key],"%H:%M")
            tout = datetime.strptime("23:59", "%H:%M")
            car[key] += (tout - tin).seconds//60
            
            car_in[key] = '' #입차 시간 초기화
    
    
    car = sorted(car.items(), key = lambda x:x[0])
    
    for c, time in car:
        count = 0
        if time < fees[0]:
            answer.append(fees[1])
        else:
            q,r = divmod(time-fees[0], fees[2])
            if r != 0:
                q += 1
            
            count = fees[1] + q*fees[3]
            answer.append(count)
    
    
        
    return answer