๋ฌธ์ ๋งํฌ
https://leetcode.com/problems/the-latest-time-to-catch-a-bus/
๋ฌธ์ ์์ฝ
๋ฒ์ค ์ถ๋ฐ ์๊ฐ์ธ buses
์ ์น๊ฐ์ ๋์ฐฉ ์๊ฐ์ธ passengers
๊ฐ ์ ์ํ ๋ฐฐ์ด๋ก ์ฃผ์ด์ง๋ค. ๋ฒ์ค ์ถ๋ฐ ์๊ฐ๊ณผ ์น๊ฐ์ ๋์ฐฉ ์๊ฐ์ ๊ณ ์ ํ ๊ฐ์ ๊ฐ์ง๊ณ ์์ด ์ค๋ณต๋์ง ์๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฒ์ค์ ํ์นํ ์ ์๋ ์น๊ฐ์ ์์ธ capacity
๊ฐ ์ฃผ์ด์ง๋ค.
์น๊ฐ์ด ๋์ฐฉํ๊ฒ ๋๋ฉด ๋ฒ์ค ์ ๋ฅ์ฅ์์ ์ค์ ์๊ฒ ๋๋ค. ์ด๋, ์จ ์์ ๋๋ก ๋ฒ์ค๋ฅผ ํ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฒ์ค ๋์ฐฉ ์๊ฐ ์ ์ ๋์ฐฉํ ์น๊ฐ๋ง ๋ฒ์ค์ ํ์นํ ์ ์๋ค.
๋ฒ์ค๊ฐ ๋์ฐฉํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ค.
- ๋ฒ์ค์ ์์ฉ ์ธ์์ ๋ง๊ฒ ์น๊ฐ์ ํ์ด๋ค.
- ๋จ์ฝ, ์ผ์ฐ ์จ ์น๊ฐ์ด ๋ฒ์ค์ ํ์นํ์ง ๋ชปํ๋ค๋ฉด ๋ค์ ๋ฒ์ค๋ฅผ ๋จผ์ ํ ์ ์๋ค.
์ด์ ๊ฐ์ ๊ณผ์ ์ ํตํด ๋ฒ์ค๋ฅผ ํ์นํ๋ค๊ณ ํ์ ๋ ๋ฒ์ค๋ฅผ ํ ์ ์๋ ์๊ฐ ์ค์์ ๊ฐ์ฅ ๋ฆ์ ์๊ฐ ์ ๊ตฌํ๋ฉด ๋๋ค.
๋จ, ๋ค๋ฅธ ์น๊ฐ๊ณผ ๋์ฐฉ ์๊ฐ์ด ๊ฒน์น ์ ์๋ค. ๋ง์ฝ, 19๋ถ์ ๋์ฐฉํ ์น๊ฐ์ด ์๋ค๋ฉด 19๋ถ์๋ ๋ค๋ฅธ ์น๊ฐ๊ณผ ๋์ฐฉ ์๊ฐ์ด ๊ฒน์น๊ฒ ๋์ด 19๋ถ์๋ ๋์ฐฉํ๋ฉด ์๋๋ค.
๋ฌธ์ ํ์ด
์์ ๋ถ์ํ๊ธฐ
๋ฌธ์ ๋ ์ด๋ ์ ๋ ์ดํดํ์ง๋ง ๋จผ์ ์์ ๋ฅผ ํตํด ๋ค์ ์ดํดํด ๋ณด์๋ค.
Input: buses = [20,30,10], passengers = [19,13,26,4,25,11,21], capacity = 2
Output: 20
์์ ๊ฐ์ด ์์ ๊ฐ ์ฃผ์ด์ง๋ค๊ณ ๊ฐ์ ํ๊ณ ๊ทธ๋ฆผ์ ๊ทธ๋ ค๊ฐ๋ฉฐ ์ดํดํ๋ ค๊ณ ํ๋ ๊ฒ ๊ฐ๋ค.
CASE 1
๊ฐ์ฅ ๋จผ์ ๋ฐฐ์ด์ ๋ณด๋ฉด ์ ๋ ฌ์ด ๋์ด์์ง ์๊ธฐ ๋๋ฌธ์ ์ ๋ ฌ์ ๋จผ์ ํด์ฃผ์๋ค.
buses = [10,20,30]
passengers = [4,11,13,19,21,25,26]
capacity = 2
๊ทธ๋ผ ์น๊ฐ์ด ๋ฒ์ค๋ฅผ ํ์นํ๊ฒ ๋๋ ๊ฒฝ์ฐ์ ๋ํด์ ๋ค์๊ณผ ๊ฐ์ด ๊ทธ๋ ค๋ณผ ์ ์๋ค.
๊ทธ๋ผ ๋ด๊ฐ ๊ฐ์ฅ ๋ฆ๊ฒ ๋์ฐฉํด๋ ๋ฒ์ค๋ฅผ ํ ์ ์๋ ์๊ฐ์ ์ธ์ ๊ฐ ๋ ๊น?
๋จผ์ , ๊ฐ์ฅ ๋ฆ๊ฒ ๋ฒ์ค๋ฅผ ํ์นํ ์น๊ฐ์ ๋์ฐฉ ์๊ฐ์ธ 21๋ถ
๋ณด๋ค๋ ๋น ๋ฆด ๋์ฐฉํด์ผ ํ๋ค. ๋ฐ๋ผ์, 20๋ถ
์ ๋์ฐฉํ๊ฒ ๋๋ฉด ๋ง์ง๋ง ๋ฒ์ค์ ๋ง์ง๋ง์ผ๋ก ํ์นํ ์ ์๊ฒ ๋๋ค.
๋ฐ๋ผ์, ๋ค์๊ณผ ๊ฐ์ด 20๋ถ
์ ๋์ฐฉํ๋ฉด ๋น์ด์๋ ๋์ฐฉ ์๊ฐ ์ค์์ ๋ฒ์ค๋ฅผ ํ ์ ์๋ ๊ฐ์ฅ ๋ฆ๊ฒ ๋ฒ์ค๋ฅผ ํ ์ ์๋ค.
ํ์ง๋ง ์ง๊ธ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ ๊ฐ์ฅ ์ด์์ ์ธ ๊ฒฝ์ฐ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ค๋ ์ดํด๋ด์ผ ํ๋ค.
CASE 2
๊ทธ๋์ ๋ ํ๋์ ์๋ฅผ ๊ฐ์ ธ์๋ดค๋ค.
Input: buses = [3], passengers = [2,4], capacity = 2
Output: 3
์ด ๊ฒฝ์ฐ์๋ ๋ฒ์ค์ ์์ฉ ์ธ์์ด 2๋ช
์ด์ง๋ง 1๋ช
๋ฐ์ ํ์ง ๋ชปํด ๋ค์๊ณผ ๊ฐ์ด 3๋ถ
์ ๋์ฐฉํ๋ฉด ๋ฒ์ค๋ฅผ ํ ์ ์๋ค.
์ด๋ ๊ฒ ๋ง์ง๋ง ๋ฒ์ค์ ์๋ฆฌ๊ฐ ๋จ๋ ๊ฒฝ์ฐ๋ ์๊ฐํด์ฃผ์ด์ผ ํ๋ค.
CASE 3
๋ ๋ค๋ฅธ ์ผ์ด์ค์ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์.
Input: buses = [18,8,3,12,9,2,7,13,20,5], passengers = [13,10,8,4,12,14,18,19,5,2,30,34], capacity = 1
Output: 11
์ด ๊ฒฝ์ฐ์๋ ๋์ฐฉ ์๊ฐ์ด ๊ฒน์น ์ ์์ด ๊ฒน์น์ง ์๋ ์๊ฐ์ ์ฐพ์์ผ๋ง ํ๋ค. ์ ๋ ฌ์ ํด์ฃผ๊ฒ ๋๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
buses = [2,3,5,7,8,9,12,13,18,20]
passengers = [2,4,5,8,10,12,13,14,18,19,30,34]
capacity = 1
๋ฒ์ค์ ์น๊ฐ์ ์๊ฐ ๋๋ฌด ๋ง์ ํ ๋์ ๋ณด๊ธฐ ์ด๋ ค์ ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ ค์ ํ์ธํด๋ดค๋ค.
์์ ๊ทธ๋ฆผ์ ๋ณด์์ ๋ ๊ฐ์ฅ ๋ฆ๊ฒ ๋ฒ์ค์ ํ์นํ ์๊ฐ์ด 14๋ถ
์ด๋ค. ๊ทธ๋ผ 13๋ถ์ ๋์ฐฉํ ์ ์๋์ง ํ์ธํด๋ณด๋ 13๋ถ์ ๋ค๋ฅธ ์น๊ฐ์ด ์ด๋ฏธ ๋์ฐฉํด์๋ค. ๊ทธ๋ฆฌ๊ณ 12๋ถ ๋ ๋ง์ฐฌ๊ฐ์ง์ธ ๊ฒ์ ํ์ธํ ์ ์์ด์ ๊ฒฐ๊ตญ์๋ 11๋ถ
์ ๋์ฐฉํด์ผ ๊ฐ์ฅ ๋ฆ๊ฒ ๋ฒ์ค๋ฅผ ํ ์ ์๋ ์๊ฐ์ด ๋๋ค.
์ด์ ๊ฐ์ด ์์ ๋ฅผ ๋ถ์ํด๋ดค์ ๋ ๋ช ๊ฐ์ง ํ์ธํ๊ณ ๋์ด๊ฐ์ผ ํ๋ ๋ถ๋ถ์ด ์๊ฒผ๋ค.
- ๊ฐ์ฅ ๋ฆ๊ฒ ๋ฒ์ค์ ํ๋ ์น๊ฐ์ ์๊ฐ์ ๊ฐ์ ธ์ค๋ฉด ๋๋ค.
- ๊ฐ์ฅ ๋ฆ๊ฒ ๋ฒ์ค์ ํ๋ ์น๊ฐ์ ์๊ฐ๋ถํฐ ๋์ฐฉ ์๊ฐ์ ํ์ธํ๋๋ฐ ๋ค๋ฅธ ์น๊ฐ๊ณผ ์๊ฐ์ด ๊ฒน์น๋ค๋ฉด ๋ง์ง๋ง ๋ฒ์ค๊ฐ ์๋ ์ด์ ๋ฒ์ค๋ฅผ ํ์ผ ํ๋ค.
- ๋ง์ง๋ง ๋ฒ์ค์ ํ์นํ ์ ์๋ ์๋ฆฌ๊ฐ ๋น์ด์๋ค๋ฉด ๋ฒ์ค๊ฐ ๋์ฐฉํ๋ ์๊ฐ๊น์ง ์๊ฐํด์ผ ํ๋ค.
๊ฒฐ๊ตญ์๋ ๋ง์ง๋ง์ ๋ฒ์ค์ ํ ์น๊ฐ์ ์๊ฐ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์ค์ํ๊ณ ๋ง์ง๋ง ๋ฒ์ค์ ์๋ฆฌ๊ฐ ๋จ์์๋ค๋ฉด ๋ฒ์ค๊ฐ ๋์ฐฉํ๋ ์๊ฐ์ ๋ง์ถฐ ๋์ฐฉํ ์ ์๋ค.
์ด์ ๊ฐ์ ์กฐ๊ฑด๋ค์ ์๊ฐํด์ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์๋ค.
์ต์ ํ ํ๊ธฐ ์ ์ฝ๋ ์์ฑ
๋จผ์ ์ ๋ ฌ์ด ๋์ด ์์ง ์์ ๋ฒ์ค์ ์น๊ฐ์ ๋ฐฐ์ด์ ์ ๋ ฌ์์ผ ์ฃผ์๋ค.
buses = sorted(buses)
passengers = sorted(passengers)
๋ค์์ผ๋ก ๋ฒ์ค์ ๋๊ฐ ํ์นํ๋์ง ์๊ณ ์ถ์ด dictionary ๋ฅผ ํ๋ ๋ง๋ค์ด์ฃผ์๋ค.
buses_dict = {bus:[] for bus in buses}
๋ค์์ผ๋ก ๊ฐ ์ธ๋ฑ์ค์ ํฌ์ธํฐ๋ฅผ ์ง์ ํด์ฃผ์๋ค.
cur_b = 0
cur_p = 0
cur_c = 0
์ถ๊ฐ๋ก ๋ง์ง๋ง ์น๊ฐ์ ์์น๋ฅผ ์ ์ฅํ ๋ณ์๋ ์์ฑํด์ฃผ์๋ค.
last_passenger = 0
๊ทธ๋ฆฌ๊ณ ์ด์ ๋ง์ง๋ง ์น๊ฐ์ด ์ด๋์๋์ง ํ์ธ์ ํ๊ธฐ ์ํด์ ๋ฒ์ค์ ์น๊ฐ์ ๋ฐฐ์ด์ ๊ฐ์ ธ์ ์กฐ๊ฑด์ ํตํด ์น๊ฐ์ด ๋ฒ์ค์ ํ์นํ๋ ๊ณผ์ ์ ์ ์ด์ฃผ์๋ค.
while cur_b < len(buses) and cur_p < len(passengers):
if cur_c == capacity:
cur_b += 1
cur_c = 0
else:
# ๋ฒ์ค๋ณด๋ค ๋นจ๋ฆฌ ๋์ฐฉํด์์ผ๋ฉด ๋ฒ์ค ํ์น
if passengers[cur_p] <= buses[cur_b]:
buses_dict[buses[cur_b]] += [passengers[cur_p]]
last_passenger = passengers[cur_p]
cur_p += 1
cur_c += 1
else:
cur_b += 1
cur_c = 0
while ๋ฌธ ์กฐ๊ฑด์ผ๋ก๋ ๋ฒ์ค๊ฐ ๊ฐ๋ ์ฐจ๊ฑฐ๋ ์น๊ฐ์ด ๋ค ํ๋ ๊ฒฝ์ฐ ์ข ๋ฃ๋๋๋ก ์ค์ ํ๊ณ ์น๊ฐ์ด ํ์นํ๊ฒ ๋๋ฉด ์์ฉ ์ธ์์ ์ฆ๊ฐ์์ผ์ฃผ์๊ณ ๋ฒ์ค๊ฐ ๊ฐ๋์ฐจ๊ฒ ๋๋ฉด 0์ผ๋ก ์ด๊ธฐํ ์์ผ์ฃผ๊ณ ๋ค์ ๋ฒ์ค๋ก ๋ณ๊ฒฝํด์ฃผ์๋ค.
์ด๋ ๋ฒ์ค์ ํ์นํ๋ ์น๊ฐ์ด ์๋ค๋ฉด ์๊น ๋ง๋ ๋์ ๋๋ฆฌ์ ํด๋น ๋ฒ์ค์ ์น๊ฐ์ ์ถ๊ฐํด์ฃผ๊ณ ๋ง์ง๋ง ์น๊ฐ์ ๋์ฐฉ ์๊ฐ์ ๊ฐฑ์ ํด์ฃผ์๋ค.
๊ทธ๋ ๊ฒ ๋ชจ๋ ์น๊ฐ์ด ๋ฒ์ค์ ํ์นํ๊ฒ ๋๋ฉด ๋ง์ง๋ง ๋ฒ์ค์ ์๋ฆฌ๊ฐ ๋น ๊ฒฝ์ฐ๋ฅผ ๋๋นํด์ ๋ค์๊ณผ ๊ฐ์ด ๋ง์ง๋ง ๋์ฐฉ ์๊ฐ์ ๋ฒ์ค๊ฐ ๋์ฐฉํ๋ ์๊ฐ์ผ๋ก ํ ๋ฒ ๋ ํ์ธํด์ฃผ์๋ค.
if len(buses_dict[buses[-1]]) < capacity:
last_passenger = buses[-1]
๊ทธ๋ผ ์ด์ ๋ง์ง๋ง ์น๊ฐ์ด ํ์นํ ์๊ฐ๋ถํฐ ํ๋์ฉ ๊ฐ์์์ผ์ฃผ๋ฉด์ ๊ฐ์ฅ ๋ฆ๊ฒ ํ ์ ์๋ ์๊ฐ์ ๊ตฌํด์ฃผ๋ฉด ๋๋ค.
for time in range(last_passenger, -1, -1):
if passengers.count(time) == 0:
lastest_time = time
break
return lastest_time
์ด๋ ๊ฒ ํด์ ํต๊ณผํ ์ ์์๋๋ฐ ์คํ ์๋๋ ๊ฑฐ์ ๊ผด๋ฑ์ ๊ฐ๊น์ ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ ๊ฑฐ์ ์ต๋๋ก ์ฌ์ฉํด์ ํ์๋ค.
๊ทธ๋์ ๋ค์ ์ต์ ํ ์์ ์ ๊ฑฐ์ณ์ฃผ์๋ ๊ฒ ๊ฐ๋ค.
์ฝ๋ ์ต์ ํํ๊ธฐ
์ต์ ํ ํ๋ ๊ณผ์ ์์ ์ต์ ํ๋ฅผ ํ ์ ์๋ ๋ถ๋ถ์ด ๋ฌด์์ด ์์๊น ๊ณ ๋ฏผํ๋ค๋ณด๋ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌ๊ฐ ๋์๋ค.
-
๋ง์ง๋ง ์น๊ฐ์ ํ์น ์๊ฐ๋ง ๊ฐ์ง๊ณ ์์ผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋์ ๋๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๋ชจ๋ ๋ฒ์ค์ ์น๊ฐ์ ๊ธฐ๋กํ ํ์๊ฐ ์๋ค.
- ๋ฒ์ค ๋ณ ์น๊ฐ์ ์ ์ฅํ๋ ๋์ ๋๋ฆฌ๊ฐ ํ์ํ์ง ์๋ค.
-
๋ฒ์ค์ ์น๊ฐ์ ๋์์ ์ฒ๋ฆฌํด์ฃผ๊ณ ์๋๋ฐ ๊ตฌ๋ถํด์ ๋์์ ์์ ํ์ง ์์๋ ๋๊ณ ๋ฒ์ค์ ์น๊ฐ๋ง ํ์ฐ๊ณ ๋ง์ง๋ง ์น๊ฐ์ ์์น๋ง ๊ธฐ์ตํ๊ณ ์์ผ๋ฉด ๋๋ค.
- ๋ฐ๋ผ์ ๋ฒ์ค๋ ๋ฐ๋ก ์ฒ๋ฆฌํ ํ์ ์์ด ์น๊ฐ๋ง ๋ฒ์ค์ ํ๋ ๊ณผ์ ์ ๋ํด์ ์ฒ๋ฆฌํด์ฃผ๋ฉด ๋๋ค.
cur = 0
for bus in buses:
cap = capacity
while cap > 0 and cur < len(passengers) and passengers[cur] <= bus:
cap -= 1
cur += 1
- ๋ฒ์ค์ ์์ฉ ์ธ์์ ๋๋ ค์ฃผ์ง๋ง๊ณ ์์ฉ ์ธ์์์ ์น๊ฐ์ด ํ์นํ ๊ฒฝ์ฐ ํ๋์ฉ ์ค์ฌ์ค๋ค.
- ๋ง์ง๋ง ๋ฒ์ค์ ์๋ฆฌ๊ฐ ๋น๋ค๋ฉด ์์ฉ ์ธ์์ด 0๋ณด๋ค ํด ๊ฒฝ์ฐ๋ง ์ฒ๋ฆฌํด์ฃผ๋ฉด๋๋ค.
- ๋ฐ๋๋ก ํ๊ฒ ๋๋ฉด ๊ฐ๋์ฐฌ ๊ฒฝ์ฐ 0์ด ๋๊ณ ๋จ์์๋ ๊ฒฝ์ฐ๊ฐ 0๋ณด๋ค ํฌ๊ฒ ๋์ด ์ฒ๋ฆฌ๊ฐ ์ด๋ ต๋ค.
last_passenger = buses[-1] if cap > 0 else passengers[cur-1]
- ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง ์น๊ฐ์ ๋์ฐฉ ์๊ฐ๋ถํฐ ํ์น์ด ๊ฐ๋ฅํ ์๊ฐ์ ๊ตฌํ๋ ๊ณผ์ ์์ count() ํจ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์น๊ฐ์ ๋ฐฐ์ด์ ํฌํจ๋๋์ง ์ฌ๋ถ๋ง ํ์ธํ๋ฉด ๋๋ค.
while last_passenger in passengers:
last_passenger -= 1
์ด๋ ๊ฒ ์ต์ ํ๋ฅผ ํ๊ณ ๋๋ ์๋์ ์ฝ๋์ ๊ฐ์ด ์ต์ ํ๋ ๋ต์์ ์ ์ถํ๊ฒ ๋์๊ณ ์คํ ๊ฒฐ๊ณผ ์คํ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํฌ๊ธฐ๊ฐ ํ ์ค์ด๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
์คํ ์๊ฐ ๋น๊ต : 612 ms -> 518 ms
๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ ๋น๊ต : 43.74 MB -> 35.28 MB
์ ์ถ ๋ต์
์ฒ์ ์ ์ถํ ๋ต์
"""
์คํ ์๊ฐ : 612 ms
๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ : 43.73 MB
์๊ฐ ๋ณต์ก๋ : O(NlogN)
"""
class Solution:
def latestTimeCatchTheBus(self, buses: List[int], passengers: List[int], capacity: int) -> int:
buses = sorted(buses)
passengers = sorted(passengers)
buses_dict = {bus:[] for bus in buses}
cur_b = 0
cur_p = 0
cur_c = 0
last_passenger = 0
while cur_b < len(buses) and cur_p < len(passengers):
if cur_c == capacity:
cur_b += 1
cur_c = 0
else:
# ๋ฒ์ค๋ณด๋ค ๋นจ๋ฆฌ ๋์ฐฉํด์์ผ๋ฉด ๋ฒ์ค ํ์น
if passengers[cur_p] <= buses[cur_b]:
buses_dict[buses[cur_b]] += [passengers[cur_p]]
last_passenger = passengers[cur_p]
cur_p += 1
cur_c += 1
else:
cur_b += 1
cur_c = 0
if len(buses_dict[buses[-1]]) < capacity:
last_passenger = buses[-1]
lastest_time = 0
for time in range(last_passenger, -1, -1):
if passengers.count(time) == 0:
lastest_time = time
break
return lastest_time
- ์คํ ๊ฒฐ๊ณผ
์ต์ ํ๋ฅผ ์งํํ ๋ต์
"""
์คํ ์๊ฐ : 518 ms
๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ : 35.28 MB
์๊ฐ ๋ณต์ก๋ : O(NlogN)
"""
class Solution:
def latestTimeCatchTheBus(self, buses: List[int], passengers: List[int], capacity: int) -> int:
buses = sorted(buses)
passengers = sorted(passengers)
cur = 0
for bus in buses:
cap = capacity
while cap > 0 and cur < len(passengers) and passengers[cur] <= bus:
cap -= 1
cur += 1
last_passenger = buses[-1] if cap > 0 else passengers[cur-1]
while last_passenger in passengers:
last_passenger -= 1
return last_passenger
- ์คํ ๊ฒฐ๊ณผ