250x250
Link
๋‚˜์˜ GitHub Contribution ๊ทธ๋ž˜ํ”„
Loading data ...
Notice
Recent Posts
Recent Comments
๊ด€๋ฆฌ ๋ฉ”๋‰ด

Data Science LAB

[Python] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต level 2 (์ฃผ์ฐจ ์š”๊ธˆ ๊ณ„์‚ฐ) ๋ณธ๋ฌธ

๐Ÿ“ Coding Test/Programmers

[Python] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต level 2 (์ฃผ์ฐจ ์š”๊ธˆ ๊ณ„์‚ฐ)

ใ…… ใ…œ ใ…” ใ…‡ 2022. 11. 5. 02:07
728x90

1. ๋ฌธ์ œ ์„ค๋ช…

์ฃผ์ฐจ์žฅ์˜ ์š”๊ธˆํ‘œ์™€ ์ฐจ๋Ÿ‰์ด ๋“ค์–ด์˜ค๊ณ (์ž…์ฐจ) ๋‚˜๊ฐ„(์ถœ์ฐจ) ๊ธฐ๋ก์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ฐจ๋Ÿ‰๋ณ„๋กœ ์ฃผ์ฐจ ์š”๊ธˆ์„ ๊ณ„์‚ฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ํ•˜๋‚˜์˜ ์˜ˆ์‹œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

 

 

 

 

2. ์ œํ•œ ์กฐ๊ฑด

  • fees์˜ ๊ธธ์ด = 4
    • fees[0] = ๊ธฐ๋ณธ ์‹œ๊ฐ„(๋ถ„)
    • 1 ≤ fees[0] ≤ 1,439
    • fees[1] = ๊ธฐ๋ณธ ์š”๊ธˆ(์›)
    • 0 ≤ fees[1] ≤ 100,000
    • fees[2] = ๋‹จ์œ„ ์‹œ๊ฐ„(๋ถ„)
    • 1 ≤ fees[2] ≤ 1,439
    • fees[3] = ๋‹จ์œ„ ์š”๊ธˆ(์›)
    • 1 ≤ fees[3] ≤ 10,000
  • 1 ≤ records์˜ ๊ธธ์ด ≤ 1,000
    • records์˜ ๊ฐ ์›์†Œ๋Š” "์‹œ๊ฐ ์ฐจ๋Ÿ‰๋ฒˆํ˜ธ ๋‚ด์—ญ" ํ˜•์‹์˜ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
    • ์‹œ๊ฐ, ์ฐจ๋Ÿ‰๋ฒˆํ˜ธ, ๋‚ด์—ญ์€ ํ•˜๋‚˜์˜ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์‹œ๊ฐ์€ ์ฐจ๋Ÿ‰์ด ์ž…์ฐจ๋˜๊ฑฐ๋‚˜ ์ถœ์ฐจ๋œ ์‹œ๊ฐ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, HH:MM ํ˜•์‹์˜ ๊ธธ์ด 5์ธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
      • HH:MM์€ 00:00๋ถ€ํ„ฐ 23:59๊นŒ์ง€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
      • ์ž˜๋ชป๋œ ์‹œ๊ฐ("25:22", "09:65" ๋“ฑ)์€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์ฐจ๋Ÿ‰๋ฒˆํ˜ธ๋Š” ์ž๋™์ฐจ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ, `0'~'9'๋กœ ๊ตฌ์„ฑ๋œ ๊ธธ์ด 4์ธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
    • ๋‚ด์—ญ์€ ๊ธธ์ด 2 ๋˜๋Š” 3์ธ ๋ฌธ์ž์—ด๋กœ, IN ๋˜๋Š” OUT์ž…๋‹ˆ๋‹ค. IN์€ ์ž…์ฐจ๋ฅผ, OUT์€ ์ถœ์ฐจ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • records์˜ ์›์†Œ๋“ค์€ ์‹œ๊ฐ์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
    • records๋Š” ํ•˜๋ฃจ ๋™์•ˆ์˜ ์ž…/์ถœ์ฐจ๋œ ๊ธฐ๋ก๋งŒ ๋‹ด๊ณ  ์žˆ์œผ๋ฉฐ, ์ž…์ฐจ๋œ ์ฐจ๋Ÿ‰์ด ๋‹ค์Œ๋‚  ์ถœ์ฐจ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ๊ฐ™์€ ์‹œ๊ฐ์—, ๊ฐ™์€ ์ฐจ๋Ÿ‰๋ฒˆํ˜ธ์˜ ๋‚ด์—ญ์ด 2๋ฒˆ ์ด์ƒ ๋‚˜ํƒ€๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ๋งˆ์ง€๋ง‰ ์‹œ๊ฐ(23:59)์— ์ž…์ฐจ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์•„๋ž˜์˜ ์˜ˆ๋ฅผ ํฌํ•จํ•˜์—ฌ, ์ž˜๋ชป๋œ ์ž…๋ ฅ์€ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      • ์ฃผ์ฐจ์žฅ์— ์—†๋Š” ์ฐจ๋Ÿ‰์ด ์ถœ์ฐจ๋˜๋Š” ๊ฒฝ์šฐ
      • ์ฃผ์ฐจ์žฅ์— ์ด๋ฏธ ์žˆ๋Š” ์ฐจ๋Ÿ‰(์ฐจ๋Ÿ‰๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™์€ ์ฐจ๋Ÿ‰)์ด ๋‹ค์‹œ ์ž…์ฐจ๋˜๋Š” ๊ฒฝ์šฐ

 

 

 

 

3. ๋‚ด ํ’€์ด

from datetime import datetime
import time
from collections import defaultdict
import math
def solution(fees, records):
    answer = []
    cars = defaultdict(list)
    for i in records:
        car_info = i.split(' ')
        cars[car_info[1]].append(car_info[0]+' '+car_info[2])
    cars = dict(sorted(cars.items()))
    
    for i in cars:
        i_fee = []
        for j in range(len(cars[i])):
            if 'IN' in cars[i][j]:
                intime = datetime.strptime(cars[i][j].split(' ')[0],'%H:%M')
                try:
                    outtime=datetime.strptime(cars[i][j+1].split(' ')[0],'%H:%M')
                except:
                    outtime = datetime.strptime('23:59','%H:%M')
                i_fee.append((outtime-intime).seconds//60)
        
        if sum(i_fee)<fees[0]:
            answer.append(fees[1])
        else:
            answer.append(int(fees[1]+math.ceil((sum(i_fee)-fees[0])/fees[2])*fees[3]))
    
    return answer

 

1. ์ฐจ๋Ÿ‰ ๋ฒˆํ˜ธ ๋ณ„ ์ž…์ฐจ ์‹œ๊ฐ„๊ณผ ์ถœ์ฐจ ์‹œ๊ฐ„์„ ๋ฐ›๊ธฐ ์œ„ํ•ด defaultdict(list)๋กœ cars ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ƒ์„ฑ

 -> ์ฐจ๋Ÿ‰ ๋ฒˆํ˜ธ ๋ณ„ [์ž…์ฐจ, ์ถœ์ฐจ] ๋”•์…”๋„ˆ๋ฆฌ ์„ ์–ธ

2. cars ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ key๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ

3. for ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฐจ๋Ÿ‰ ๋ณ„ ์ฃผ์ฐจ ์‹œ๊ฐ„์˜ ํ•ฉ๊ณ„์‚ฐ

-> IN ๊ธ€์ž๊ฐ€ ๋ฌธ์ž์—ด ์•ˆ์— ์กด์žฌํ•˜๋ฉด strptime()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜

-> try~except ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž…์ฐจ ๋‹ค์Œ ์ถœ์ฐจ ๊ธฐ๋ก์ด ์กด์žฌํ•˜๋ฉด ์ถœ์ฐจ์‹œ๊ฐ„์œผ๋กœ outtime ์„ ์–ธ, ์ถœ์ฐจ ๊ธฐ๋ก์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด 23:59๋กœ ์„ ์–ธ

4. ์ž…์ฐจ์‹œ๊ฐ„๊ณผ ์ถœ์ฐจ์‹œ๊ฐ„์˜ ์ฐจ๋ฅผ ๊ตฌํ•œ ๋‹ค์Œ ๋ถ„์œผ๋กœ ๋ณ€ํ™˜ํ•จ

5. ์ฐจ๋Ÿ‰ ๋ฒˆํ˜ธ๋ณ„ ์ด ์ฃผ์ฐจ์‹œ๊ฐ„์˜ ํ•ฉ์„ ๊ตฌํ•˜์—ฌ ๊ธฐ๋ณธ ์š”๊ธˆ ์‹œ๊ฐ„๋ณด๋‹ค ์ ์œผ๋ฉด ๊ธฐ๋ณธ์š”๊ธˆ์œผ๋กœ answer list์— ์ถ”๊ฐ€

๊ธฐ๋ณธ ์š”๊ธˆ ์‹œ๊ฐ„๋ณด๋‹ค ๋งŽ์œผ๋ฉด ๋‹จ์œ„์‹œ๊ฐ„์œผ๋กœ ๋‚˜๋ˆˆ ๋’ค, ๋‹จ์œ„์‹œ๊ฐ„๋ณ„ ์š”๊ธˆ ๊ณฑํ•จ + ๊ธฐ๋ณธ์š”๊ธˆ ๊ณ„์‚ฐํ•˜์—ฌ answer list์— ์ถ”๊ฐ€ํ•˜์—ฌ  answer ๋ฐ˜ํ™˜

 

 

 

 

4. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

from collections import defaultdict
from math import ceil

class Parking:
    def __init__(self, fees):
        self.fees = fees
        self.in_flag = False
        self.in_time = 0
        self.total = 0

    def update(self, t, inout):
        self.in_flag = True if inout=='IN' else False
        if self.in_flag:  self.in_time = str2int(t)
        else:             self.total  += (str2int(t)-self.in_time)

    def calc_fee(self):
        if self.in_flag: self.update('23:59', 'out')
        add_t = self.total - self.fees[0]
        return self.fees[1] + ceil(add_t/self.fees[2]) * self.fees[3] if add_t >= 0 else self.fees[1]

def str2int(string):
    return int(string[:2])*60 + int(string[3:])

def solution(fees, records):
    recordsDict = defaultdict(lambda:Parking(fees))
    for rcd in records:
        t, car, inout = rcd.split()
        recordsDict[car].update(t, inout)
    return [v.calc_fee() for k, v in sorted(recordsDict.items())]

 

 

 

import math

def solution(fees, records):
    check = {}

    for record in records:
        time, number, status = record.split()
        time = time.split(':')
        time = int(time[0])*60 + int(time[1])
        if number not in check:
            check[number] = (0, time, status)
        if status == 'IN':
            check[number] = (check[number][0], time, status)
        elif status == 'OUT':
            total_time, in_time, _ = check[number]
            total_time += time - in_time
            check[number] = (total_time, time, status)

    result = {}

    for number in check.keys():
        total_time, time, status = check[number]
        if status == 'IN':
            total_time += 1439 - time
        fee = fees[1]
        if total_time <= fees[0]:
            result[number] = fee
        else:
            fee = fee + math.ceil((total_time - fees[0]) / fees[2]) * fees[-1]
            result[number] = fee

    return list(map(lambda x : x[1], sorted(result.items())))
728x90
Comments