๏นฅ

Leetcode 2332. The Latest Time to Catch a Bus (Python3)

@๋‚จ์ œ์ด ยท 2024๋…„ 07์›” 25์ผ ยท 5๋ถ„
problem_solvingleetcodepython

๋ฌธ์ œ ๋งํฌ

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

๊ทธ๋Ÿผ ์Šน๊ฐ์ด ๋ฒ„์Šค๋ฅผ ํƒ‘์Šนํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ทธ๋ ค๋ณผ ์ˆ˜ ์žˆ๋‹ค.


image


๊ทธ๋Ÿผ ๋‚ด๊ฐ€ ๊ฐ€์žฅ ๋Šฆ๊ฒŒ ๋„์ฐฉํ•ด๋„ ๋ฒ„์Šค๋ฅผ ํƒˆ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์€ ์–ธ์ œ๊ฐ€ ๋ ๊นŒ?

๋จผ์ €, ๊ฐ€์žฅ ๋Šฆ๊ฒŒ ๋ฒ„์Šค๋ฅผ ํƒ‘์Šนํ•œ ์Šน๊ฐ์˜ ๋„์ฐฉ ์‹œ๊ฐ„์ธ 21๋ถ„ ๋ณด๋‹ค๋Š” ๋น ๋ฆด ๋„์ฐฉํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, 20๋ถ„ ์— ๋„์ฐฉํ•˜๊ฒŒ ๋˜๋ฉด ๋งˆ์ง€๋ง‰ ๋ฒ„์Šค์— ๋งˆ์ง€๋ง‰์œผ๋กœ ํƒ‘์Šนํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด 20๋ถ„์— ๋„์ฐฉํ•˜๋ฉด ๋น„์–ด์žˆ๋Š” ๋„์ฐฉ ์‹œ๊ฐ„ ์ค‘์—์„œ ๋ฒ„์Šค๋ฅผ ํƒˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋Šฆ๊ฒŒ ๋ฒ„์Šค๋ฅผ ํƒˆ ์ˆ˜ ์žˆ๋‹ค.


image2


ํ•˜์ง€๋งŒ ์ง€๊ธˆ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ๊ฒฝ์šฐ์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋“ค๋„ ์‚ดํŽด๋ด์•ผ ํ•œ๋‹ค.

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

๋ฒ„์Šค์™€ ์Šน๊ฐ์˜ ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„ ํ•œ ๋ˆˆ์— ๋ณด๊ธฐ ์–ด๋ ค์›Œ ๊ทธ๋ฆผ์œผ๋กœ ๊ทธ๋ ค์„œ ํ™•์ธํ•ด๋ดค๋‹ค.


image4


์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด์•˜์„ ๋•Œ ๊ฐ€์žฅ ๋Šฆ๊ฒŒ ๋ฒ„์Šค์— ํƒ‘์Šนํ•œ ์‹œ๊ฐ„์ด 14๋ถ„ ์ด๋‹ค. ๊ทธ๋Ÿผ 13๋ถ„์— ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋‹ˆ 13๋ถ„์— ๋‹ค๋ฅธ ์Šน๊ฐ์ด ์ด๋ฏธ ๋„์ฐฉํ•ด์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  12๋ถ„ ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ฒฐ๊ตญ์—๋Š” 11๋ถ„ ์— ๋„์ฐฉํ•ด์•ผ ๊ฐ€์žฅ ๋Šฆ๊ฒŒ ๋ฒ„์Šค๋ฅผ ํƒˆ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด ๋œ๋‹ค.


image5


์ด์™€ ๊ฐ™์ด ์˜ˆ์ œ๋ฅผ ๋ถ„์„ํ•ด๋ดค์„ ๋•Œ ๋ช‡ ๊ฐ€์ง€ ํ™•์ธํ•˜๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์ƒ๊ฒผ๋‹ค.

  • ๊ฐ€์žฅ ๋Šฆ๊ฒŒ ๋ฒ„์Šค์— ํƒ€๋Š” ์Šน๊ฐ์˜ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์˜ค๋ฉด ๋œ๋‹ค.
  • ๊ฐ€์žฅ ๋Šฆ๊ฒŒ ๋ฒ„์Šค์— ํƒ€๋Š” ์Šน๊ฐ์˜ ์‹œ๊ฐ„๋ถ€ํ„ฐ ๋„์ฐฉ ์‹œ๊ฐ„์„ ํ™•์ธํ•˜๋Š”๋ฐ ๋‹ค๋ฅธ ์Šน๊ฐ๊ณผ ์‹œ๊ฐ„์ด ๊ฒน์นœ๋‹ค๋ฉด ๋งˆ์ง€๋ง‰ ๋ฒ„์Šค๊ฐ€ ์•„๋‹Œ ์ด์ „ ๋ฒ„์Šค๋ฅผ ํƒ€์•ผ ํ•œ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๋ฒ„์Šค์— ํƒ‘์Šนํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฆฌ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด ๋ฒ„์Šค๊ฐ€ ๋„์ฐฉํ•˜๋Š” ์‹œ๊ฐ„๊นŒ์ง€ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค.

๊ฒฐ๊ตญ์—๋Š” ๋งˆ์ง€๋ง‰์— ๋ฒ„์Šค์— ํƒ„ ์Šน๊ฐ์˜ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๊ณ  ๋งˆ์ง€๋ง‰ ๋ฒ„์Šค์— ์ž๋ฆฌ๊ฐ€ ๋‚จ์•„์žˆ๋‹ค๋ฉด ๋ฒ„์Šค๊ฐ€ ๋„์ฐฉํ•˜๋Š” ์‹œ๊ฐ„์— ๋งž์ถฐ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ์กฐ๊ฑด๋“ค์„ ์ƒ๊ฐํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์•˜๋‹ค.


์ตœ์ ํ™” ํ•˜๊ธฐ ์ „ ์ฝ”๋“œ ์ž‘์„ฑ

๋จผ์ € ์ •๋ ฌ์ด ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋ฒ„์Šค์™€ ์Šน๊ฐ์˜ ๋ฐฐ์—ด์„ ์ •๋ ฌ์‹œ์ผœ ์ฃผ์—ˆ๋‹ค.

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
  • ์‹คํ–‰ ๊ฒฐ๊ณผ

image88


์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•œ ๋‹ต์•ˆ

"""
์‹คํ–‰ ์‹œ๊ฐ„ : 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
  • ์‹คํ–‰ ๊ฒฐ๊ณผ

image99