[ํ๋ก๊ทธ๋๋จธ์ค | Python] ์ฃผ์ฐจ ์๊ธ ๊ณ์ฐ
๐ ๋ฌธ์ ์ ๋ณด
- ์ถ์ฒ : 2022 KAKAO BLIND RECRUITMENT
- ๋์ด๋ : Level 2
- ๋ฌธ์ ๋งํฌ : 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
๐ ๋ฌธ์ ์ค๋ช
๋ฌธ์ ์ค๋ช
์ฃผ์ฐจ์ฅ์ ์๊ธํ์ ์ฐจ๋์ด ๋ค์ด์ค๊ณ (์ ์ฐจ) ๋๊ฐ(์ถ์ฐจ) ๊ธฐ๋ก์ด ์ฃผ์ด์ก์ ๋, ์ฐจ๋๋ณ๋ก ์ฃผ์ฐจ ์๊ธ์ ๊ณ์ฐํ๋ ค๊ณ ํฉ๋๋ค. ์๋๋ ํ๋์ ์์๋ฅผ ๋ํ๋ ๋๋ค.
- ์๊ธํ
๊ธฐ๋ณธ ์๊ฐ(๋ถ) | ๊ธฐ๋ณธ ์๊ธ(์) | ๋จ์ ์๊ฐ(๋ถ) | ๋จ์ ์๊ธ(์) |
180 | 5000 | 10 | 600 |
- ์ /์ถ์ฐจ ๊ธฐ๋ก
์๊ฐ(์:๋ถ) | ์ฐจ๋ ๋ฒํธ | ๋ด์ญ |
05:34 | 5961 | ์ ์ฐจ |
06:00 | 0000 | ์ ์ฐจ |
06:34 | 0000 | ์ถ์ฐจ |
07:59 | 5961 | ์ถ์ฐจ |
07:59 | 0148 | ์ ์ฐจ |
18:59 | 0000 | ์ ์ฐจ |
19:09 | 0148 | ์ถ์ฐจ |
22:59 | 5961 | ์ ์ฐจ |
23:00 | 5961 | ์ถ์ฐจ |
- ์๋์ฐจ๋ณ ์ฃผ์ฐจ ์๊ธ
์ฐจ๋ ๋ฒํธ | ๋์ ์ฃผ์ฐจ ์๊ฐ(๋ถ) | ์ฃผ์ฐจ ์๊ธ(์) |
0000 | 34 + 300 = 334 | 5000 + ⌈(334 - 180) / 10⌉ x 600 = 14600 |
0148 | 670 | 5000 +⌈(670 - 180) / 10⌉x 600 = 34400 |
5961 | 145 + 1 = 146 | 5000 |
- ์ด๋ค ์ฐจ๋์ด ์
์ฐจ๋ ํ์ ์ถ์ฐจ๋ ๋ด์ญ์ด ์๋ค๋ฉด, 23:59์ ์ถ์ฐจ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.
- 0000๋ฒ ์ฐจ๋์ 18:59์ ์ ์ฐจ๋ ์ดํ, ์ถ์ฐจ๋ ๋ด์ญ์ด ์์ต๋๋ค. ๋ฐ๋ผ์, 23:59์ ์ถ์ฐจ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.
- 00:00๋ถํฐ 23:59๊น์ง์ ์ /์ถ์ฐจ ๋ด์ญ์ ๋ฐํ์ผ๋ก ์ฐจ๋๋ณ ๋์ ์ฃผ์ฐจ ์๊ฐ์ ๊ณ์ฐํ์ฌ ์๊ธ์ ์ผ๊ด๋ก ์ ์ฐํฉ๋๋ค.
- ๋์ ์ฃผ์ฐจ ์๊ฐ์ด ๊ธฐ๋ณธ ์๊ฐ์ดํ๋ผ๋ฉด, ๊ธฐ๋ณธ ์๊ธ์ ์ฒญ๊ตฌํฉ๋๋ค.
- ๋์ ์ฃผ์ฐจ ์๊ฐ์ด ๊ธฐ๋ณธ ์๊ฐ์ ์ด๊ณผํ๋ฉด, ๊ธฐ๋ณธ ์๊ธ์ ๋ํด์, ์ด๊ณผํ ์๊ฐ์ ๋ํด์ ๋จ์ ์๊ฐ ๋ง๋ค ๋จ์ ์๊ธ์ ์ฒญ๊ตฌํฉ๋๋ค.
- ์ด๊ณผํ ์๊ฐ์ด ๋จ์ ์๊ฐ์ผ๋ก ๋๋์ด ๋จ์ด์ง์ง ์์ผ๋ฉด, ์ฌ๋ฆผํฉ๋๋ค.
- ⌈a⌉ : a๋ณด๋ค ์์ง ์์ ์ต์์ ์ ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฆ, ์ฌ๋ฆผ์ ์๋ฏธํฉ๋๋ค.
์ฃผ์ฐจ ์๊ธ์ ๋ํ๋ด๋ ์ ์ ๋ฐฐ์ด fees, ์๋์ฐจ์ ์ /์ถ์ฐจ ๋ด์ญ์ ๋ํ๋ด๋ ๋ฌธ์์ด ๋ฐฐ์ด records๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. ์ฐจ๋ ๋ฒํธ๊ฐ ์์ ์๋์ฐจ๋ถํฐ ์ฒญ๊ตฌํ ์ฃผ์ฐจ ์๊ธ์ ์ฐจ๋ก๋๋ก ์ ์ ๋ฐฐ์ด์ ๋ด์์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ ์ฌํญ
- 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)์ ์ ์ฐจ๋๋ ๊ฒฝ์ฐ๋ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง์ง ์์ต๋๋ค.
- ์๋์ ์๋ฅผ ํฌํจํ์ฌ, ์๋ชป๋ ์
๋ ฅ์ ์ฃผ์ด์ง์ง ์์ต๋๋ค.
- ์ฃผ์ฐจ์ฅ์ ์๋ ์ฐจ๋์ด ์ถ์ฐจ๋๋ ๊ฒฝ์ฐ
- ์ฃผ์ฐจ์ฅ์ ์ด๋ฏธ ์๋ ์ฐจ๋(์ฐจ๋๋ฒํธ๊ฐ ๊ฐ์ ์ฐจ๋)์ด ๋ค์ ์ ์ฐจ๋๋ ๊ฒฝ์ฐ
์ ์ถ๋ ฅ ์
fees | records | result |
[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] |
[120, 0, 60, 591] | ["16:00 3961 IN","16:00 0202 IN","18:00 3961 OUT","18:00 0202 OUT","23:58 3961 IN"] | [0, 591] |
[1, 461, 1, 10] | ["00:00 1234 IN"] | [14841] |
์ ์ถ๋ ฅ ์ ์ค๋ช
์ ์ถ๋ ฅ ์ #1
๋ฌธ์ ์์์ ๊ฐ์ต๋๋ค.
์ ์ถ๋ ฅ ์ #2
- ์๊ธํ
๊ธฐ๋ณธ ์๊ฐ(๋ถ) | ๊ธฐ๋ณธ ์๊ธ(์) | ๋จ์ ์๊ฐ(๋ถ) | ๋จ์ ์๊ธ(์) |
120 | 0 | 60 | 591 |
- ์ /์ถ์ฐจ ๊ธฐ๋ก
์๊ฐ(์:๋ถ) | ์ฐจ๋ ๋ฒํธ | ๋ด์ญ |
16:00 | 3961 | ์ ์ฐจ |
16:00 | 0202 | ์ ์ฐจ |
18:00 | 3961 | ์ถ์ฐจ |
18:00 | 0202 | ์ถ์ฐจ |
23:58 | 3961 | ์ ์ฐจ |
- ์๋์ฐจ๋ณ ์ฃผ์ฐจ ์๊ธ
์ฐจ๋ ๋ฒํธ | ๋์ ์ฃผ์ฐจ ์๊ฐ(๋ถ) | ์ฃผ์ฐจ ์๊ธ(์) |
0202 | 120 | 0 |
3961 | 120 + 1 = 121 | 0 +⌈(121 - 120) / 60⌉x 591 = 591 |
- 3961๋ฒ ์ฐจ๋์ 2๋ฒ์งธ ์ ์ฐจ๋ ํ์๋ ์ถ์ฐจ๋ ๋ด์ญ์ด ์์ผ๋ฏ๋ก, 23:59์ ์ถ์ฐจ๋์๋ค๊ณ ๊ฐ์ฃผํฉ๋๋ค.
์ ์ถ๋ ฅ ์ #3
- ์๊ธํ
๊ธฐ๋ณธ ์๊ฐ(๋ถ) | ๊ธฐ๋ณธ ์๊ธ(์) | ๋จ์ ์๊ฐ(๋ถ) | ๋จ์ ์๊ธ(์) |
1 | 461 | 1 | 10 |
- ์ /์ถ์ฐจ ๊ธฐ๋ก
์๊ฐ(์:๋ถ) | ์ฐจ๋ ๋ฒํธ | ๋ด์ญ |
00:00 | 1234 | ์ ์ฐจ |
- ์๋์ฐจ๋ณ ์ฃผ์ฐจ ์๊ธ
์ฐจ๋ ๋ฒํธ | ๋์ ์ฃผ์ฐจ ์๊ฐ(๋ถ) | ์ฃผ์ฐจ ์๊ธ(์) |
1234 | 1439 | 461 +⌈(1439 - 1) / 1⌉x 10 = 14841 |
- 1234๋ฒ ์ฐจ๋์ ์ถ์ฐจ ๋ด์ญ์ด ์์ผ๋ฏ๋ก, 23:59์ ์ถ์ฐจ๋์๋ค๊ณ ๊ฐ์ฃผํฉ๋๋ค.
์ ํ์๊ฐ ์๋ด
- ์ ํ์ฑ ํ ์คํธ : 10์ด
๐ ๋ฌธ์ ํ์ด
๋ฐฉ๋ฒ 1. defaultdict ํ์ฉ
from collections import defaultdict
import math
def solution(fees, records):
answer = []
car_list = defaultdict(list)
last_out = int(23*60 + 59)
# dict๋ก ์ ๋ฆฌ
for rec in range(len(records)):
time, number, action = records[rec].split(' ')
hr, mn = time.split(':')
minutes = int(hr)*60 + int(mn)
car_list[number].append(minutes)
sorted_car_list = sorted(car_list.items())
final_car_list = [0] * len(car_list)
for car in range(len(sorted_car_list)):
# ์๊ฐ ๊ณ์ฐ
if len(sorted_car_list[car][1]) % 2 == 1:
sorted_car_list[car][1].append(last_out)
total_time = 0
for t in range(len(list(sorted_car_list)[car][1])):
if t % 2 == 1:
total_time += int(sorted_car_list[car][1][t])
else:
total_time -= int(sorted_car_list[car][1][t])
final_car_list[car] = total_time
# ์๊ธ ๊ณ์ฐ
if int(final_car_list[car]) <= fees[0]:
answer.append(fees[1])
else:
answer.append(fees[1] + math.ceil((final_car_list[car] - fees[0])/fees[2]) * fees[3])
return answer
๋ฐฉ๋ฒ 2. defaultdict , class + lambda ํ์ฉ
class๋ฅผ ์์ฑํ์ฌ ๊น๋ํ๊ฒ ํผ ํ์ด๊ฐ ์์ด ์ฐธ๊ณ ํด๋ณด์๋ค.
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())]
๋ฐฉ๋ฒ 3. ์ ์ - Kakao Tech ํด์ค
- ์ฐจ๋๋ฒํธ์ ๋ฒ์๊ฐ 0000~9999์ด๋ฏ๋ก, ์ฐจ๋์ ์๋ ์ต๋ 1๋ง ๋์
๋๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ ๋ ๋ฐฐ์ด in_time, total_time์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๋ค.
- in_time[i] = i๋ฒ ์ฐจ๋์ด ์ฃผ์ฐจ์ฅ์ ์
์ฐจ ๋ ์๊ฐ
- ์ ์ฐจ ๋ ์ ์ด ์๊ฑฐ๋, ์ถ์ฐจ๋์๋ค๋ฉด -1์ ์ ์ฅ
- total_time[i] = i๋ฒ ์ฐจ๋์ ๋์ ์ฃผ์ฐจ ์๊ฐ
- in_time[i] = i๋ฒ ์ฐจ๋์ด ์ฃผ์ฐจ์ฅ์ ์
์ฐจ ๋ ์๊ฐ
- ๊ทธ ํ records์ ๋ด๊ธด ์์๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํด ์ค๋ค.
- “IN”์ ํฌํจํ๊ณ ์๋ค๋ฉด, ์๊ฐ์ ์ ์ฅํฉ๋๋ค.
- in_time[์ฐจ๋๋ฒํธ] = ์๊ฐ
- “OUT”์ ํฌํจํ๊ณ ์๋ค๋ฉด, ๋์ ์ฃผ์ฐจ ์๊ฐ์ ๊ฐฑ์ ํ๋ค.
- total_time[์ฐจ๋๋ฒํธ] += ( ์๊ฐ – in_time[์ฐจ๋๋ฒํธ] )
- in_time[์ฐจ๋๋ฒํธ] = -1
- “IN”์ ํฌํจํ๊ณ ์๋ค๋ฉด, ์๊ฐ์ ์ ์ฅํฉ๋๋ค.
- records๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ ํ์๋ ์ถ์ฐจ๋์ง ์์ ์ฐจ๋์ด ์๋ค๋ฉด, ์ฆ, in_time[i] != -1์ธ ๋ชจ๋ i๋ฒ ์ฐจ๋์ ๋ํด์๋ 23์ 59๋ถ(1439๋ถ)์ ์ถ์ฐจ๋์๋ค๊ณ ๊ฐ์ฃผํ๊ณ , total_time[i]๋ฅผ ๊ฐฑ์ ํด์ค๋ค.
- total_time[i] += ( 1439 – in_time[i] )
- ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋์ ์ฃผ์ฐจ ์๊ฐ์ ๊ณ์ฐํ ํ, total_time[i] > 0 ๋ฅผ ๋ง์กฑํ๋ ๋ชจ๋ i๋ฒ ์ฐจ๋์ ๋ํด์, ์ค๋ฆ์ฐจ์์ผ๋ก ์ฃผ์ฐจ ์๊ธ์ ๊ณ์ฐํด์ ๋ฐฐ์ด์ ๋ด์ผ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๐ก What I learned
๋ณต์กํ๊ฒ ๊ตฌํ์ ๊ฐ๋ฅํ๋, โ ์๊ฐ์ด ๋ฌด์ฒ ์ค๋๊ฑธ๋ ธ๊ณ โก ํ๋ฆฐ ๋ถ๋ถ์์ ์ธ๋ฑ์ค ๋ฑ์ ๊ณ ์น๋ ๋ฐ์ ๋งค์ฐ ์ ๋ฅผ ๋จน์๋ค.
1. class ์ ํ์ฉ
ํด๋์ค๋ฅผ ํตํด ๋ณต์ก์ฑ์ ๋ ์ ์๊ณ , ๊ธฐ๋ฅ์ ์์ ํ ๋์๋ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ ๋ฏ ํ๋ค. ํด๋์ค์ ๋ํ ๊ฐ๋ ์ด ๋ถ์กฑํ๋ค ํ๋จํ์ฌ ๋ค์๊ณผ ๊ฐ์ ํฌ์คํ ์ผ๋ก ์ ๋ฆฌํ์๋ค.
[Python] ํด๋์ค(class)๋?
์ฉ์ด์ ๊ฐ๋ class๋? ํด๋์ค = ๊ฐ์ฒด๋ฅผ ํํํ๊ธฐ ์ํ ๋ฌธ๋ฒ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ๊ฐ์ฒด*๋ฅผ ๋ง๋ค ๋์ ์ฌ์ฉํ๋ ๊ฒ์ด ํด๋์ค์ด๋ค. ํด๋์ค๋ ํฌ๊ฒ ์์ฑ๊ณผ ๋ฉ์๋๋ก ๊ตฌ๋ถ๋๋ค. attribute (์์ฑ) : ๋งค๊ฐ๋ณ
minjin-sw.tistory.com
2. lambda ์ ํ์ฉ
lambda๋ ํจ์๋ฅผ ๋ฑ ํ ์ค๋ง์ผ๋ก๋ ๋ง๋ค๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋์ ๊ธด ์ฝ๋๋ฅผ ๊ฐ์ํํ๋ ๋ฐ์ ํ์์ ์ธ ๊ธฐ๋ฅ์ด๋ผ ์๊ฐํ๋ค. lambda ํจ์๋lambda ๋งค๊ฐ๋ณ์ : ํํ์ ํ์์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ค.
# ํจ์์ ์ผ๋ฐ์ ํํ
def hap(x, y):
return x + y
hap(10, 20) # -> 30
# ์์ ์์ lambda๋ฅผ ํตํด ํํ
(lambda x,y: x + y)(10, 20) # -> 30