Algorithm

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ํƒ๋ฐฐ ๋ฐฐ๋‹ฌ๊ณผ ์ˆ˜๊ฑฐํ•˜๊ธฐ (2023 KAKAO BLIND RECRUITMENT) - Python

lerrybe 2023. 2. 24. 11:29

2023 KAKAO BLIND RECRUITMENT - Lv2.

๐ŸŒต ๋ฌธ์ œ


https://school.programmers.co.kr/learn/courses/30/lessons/150369

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

 

๐Ÿš€ ํ’€์ด


์ฒ˜์Œ์—๋Š” O(N^2) ์ •๋„์˜ ํ’€์ด๋ฐ–์— ์ƒ๊ฐ์ด ์•ˆ๋‚ฌ๋Š”๋ฐ, input์ธ n ๋ฒ”์œ„ ๋ณด๋‹ˆ๊นŒ ๊ฐ์ด ์•ˆ๋‚˜์˜ค๋”๋ผ๊ณ ์š”.. ๊ทธ๋ž˜์„œ ์ข€ ๊ฒฐ์ด ๋‹ค๋ฅด๊ธด ํ•˜์ง€๋งŒ ์•„๋ž˜ ๊ตฌ๋ช…๋ณดํŠธ ๋ฌธ์ œ ํ‘ผ ๊ฒƒ์ฒ˜๋Ÿผ ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š” ์นœ๊ตฌ, task๊ฐ€ ๋‹ค ํ•ด๊ฒฐ๋œ ์นœ๊ตฌ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ณด๋‚ด์ฃผ๋Š” (์‹ ๊ฒฝ๊บผ์ฃผ๋Š”) ๊ทธ๋ฆฌ๋””ํ•œ ๋ฐฉ์‹์€ ์–ด๋–จ๊นŒ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

 

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ตฌ๋ช…๋ณดํŠธ - Python

(2022๋…„ 4์›” ๊ฒฝ ์ž‘์„ฑ๋œ ๊ธ€์ž…๋‹ˆ๋‹ค.) ๋ฌธ์ œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๊ตฌ๋ช…๋ณดํŠธ ๋ฌด์ธ๋„์— ๊ฐ‡ํžŒ ์‚ฌ๋žŒ๋“ค์„ ๊ตฌ๋ช…๋ณดํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌ์ถœํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ช…๋ณดํŠธ๋Š” ์ž‘์•„์„œ ํ•œ ๋ฒˆ์— ์ตœ๋Œ€ 2๋ช…์”ฉ ๋ฐ–์— ํƒˆ ์ˆ˜ ์—†๊ณ , ๋ฌด

lerryroad.tistory.com

 

์ผ๋‹จ ํŠธ๋Ÿญ์— ์ˆ˜๋Ÿ‰์€ ๋Š˜ ๊ฝ‰๊ฝ‰ ๋‹ด๊ณ  ๋‹ค๋‹Œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ , ๊ฐ€์žฅ ๋จผ ์ง‘๋ถ€ํ„ฐ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

 

๋งจ ๋ ์ง‘์˜ ๋ฐฐ๋‹ฌ๊ณผ ์ˆ˜๊ฑฐ๊ฐ€ ๋๋‚˜๊ธฐ ์œ„ํ•ด์„œ ๋ช‡ ๋ฒˆ ์™”๋‹ค๊ฐ”๋‹ค ํ•ด์•ผํ•˜๋Š”์ง€ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ deliver_cnt์™€ pickup_cnt๋กœ ๋‘๊ณ  ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฌ๋Š”๋ฐ, ๋ฐฐ๋‹ฌ ์ˆ˜๋Ÿ‰๊ณผ ์ˆ˜๊ฑฐ ์ˆ˜๋Ÿ‰์ด ๊ฐ๊ฐ ๋ชจ๋‘ ์†Œ์ง„๋˜์—ˆ์„ ๋•Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ข…๋ฃŒ์กฐ๊ฑด์„ ๋’€์Šต๋‹ˆ๋‹ค. ํšŸ์ˆ˜ ์ฒดํฌ๋ฅผ ์œ„ํ•จ์ด๋‹ˆ๊นŒ ์‹ค์ œ ์ˆ˜๋Ÿ‰์—์„œ ๋นผ๋ฒ„๋ฆฌ๋ฉด ์•ˆ๋˜๋‹ˆ๊นŒ, temp๋„ ๋’€์Šต๋‹ˆ๋‹ค. (์ˆ˜๋Ÿ‰์€ ์ƒ๊ฐํ•˜๊ธฐ ํŽธํ•˜๋ผ๊ณ  ๋‚จ์€ deliver ์ˆ˜๋Ÿ‰์€ ์–‘์ˆ˜๋กœ, ๋‚จ์€ pickup ์ˆ˜๋Ÿ‰์€ ์Œ์ˆ˜๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ์†Œ์ง„๋˜๋Š” ์กฐ๊ฑด ์ฒดํฌ๋„ deliver ์ˆ˜๋Ÿ‰์€ 0๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์„ ๋•Œ + pickup ์ˆ˜๋Ÿ‰์€ 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์„ ๋•Œ๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.) 

 

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ๋‚˜์˜จ deliver_cnt์™€ pickup_cnt ์ค‘ ๋” ํฐ ๊ฐ’ (๋‘˜ ๋‹ค task๊ฐ€ ์†Œ์ง„๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ) ์„ ์„ ํƒํ•ด ๋งจ ๋ ์ง‘์—์„œ์˜ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ–ˆ๊ณ  (cnt), ๋งจ ๋ ์ง‘์„ ์ •๋ณตํ•˜๊ธฐ๊นŒ์ง€์˜ ์ด๋™ ๊ฑฐ๋ฆฌ๋ฅผ ์ด ๊ฑฐ๋ฆฌ์— ๋”ํ•ด์ค๋‹ˆ๋‹ค. (distance += (i + 1) * cnt * 2) ์™”๋‹ค ๊ฐ”๋‹ค๊ฐ€ ํ•œ ์„ธํŠธ๋‹ˆ๊นŒ ๊ณฑํ•˜๊ธฐ 2๋„ ํ•ด์ค๋‹ˆ๋‹ค. 

 

for๋ฌธ ๋‚ด๋ถ€์—์„œ remain_deliver๊ณผ remain_pickup์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ์ง€ ์•Š๊ณ  ๊ธฐ์กด ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์“ฐ๋Š” ๊ฑด, ๋‚จ์€ ๋ฌผํ’ˆ์€ ์˜ค๋Š” ๊ธธ์— ์ฑ„์šฐ๊ฑฐ๋‚˜ ์ˆ˜๊ฑฐํ•˜๊ณ  ์˜ฌ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฐ€์žฅ ์„ผํ„ฐ์™€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ง‘๊นŒ์ง€ ๋Œ๊ณ  ๋‚˜๋ฉด ์ด๋™ํ•œ ์ตœ์†Œ๊ฑฐ๋ฆฌ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 


๐Ÿ’ก ํ’€์ด ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

def solution(cap, n, deliveries, pickups):
    distance = 0  # ์ตœ์ข… ๊ฑฐ๋ฆฌ
    remain_deliver = 0
    remain_pickup = 0
    for i in range(n - 1, -1, -1):  # ๊ฐ€์žฅ ๋จผ ์ง‘๋ถ€ํ„ฐ ์ •๋ณต
        remain_deliver += deliveries[i]  # ํ˜„์žฌ ๋ณด๊ณ  ์žˆ๋Š” ์ง‘ ๊นŒ์ง€์˜ ๋‚จ์€ ๋ฐฐ๋‹ฌ ์ˆ˜, ์–‘์ˆ˜๋กœ ๊ด€๋ฆฌ
        remain_pickup -= pickups[i]  # ํ˜„์žฌ ๋ณด๊ณ  ์žˆ๋Š” ์ง‘ ๊นŒ์ง€์˜ ๋‚จ์€ ์ˆ˜๊ฑฐ ์ˆ˜, ์Œ์ˆ˜๋กœ ๊ด€๋ฆฌ

        deliver_cnt = 0
        pickup_cnt = 0
        temp_deliver = remain_deliver  # deliver count ์ฒดํฌ๋ฅผ ์œ„ํ•œ ์ž„์‹œ remain_deliver
        temp_pickup = remain_pickup  # pickup count ์ฒดํฌ๋ฅผ ์œ„ํ•œ ์ž„์‹œ remain_pickup
        # ํ˜„์žฌ ๋ณด๊ณ  ์žˆ๋Š” ์ง‘์˜ task ๊ฐ€ ์†Œ์ง„ ๋˜๊ธฐ ๊นŒ์ง€์˜ ๊ณผ์ •, 0 ๊ธฐ์ค€ ์กฐ๊ฑด ๋งŒ์กฑ (์†Œ์ง„)
        while True:
            if temp_deliver <= 0:
                break
            temp_deliver -= cap
            deliver_cnt += 1
        while True:
            if temp_pickup >= 0:
                break
            temp_pickup += cap
            pickup_cnt += 1

        # cnt: ์ฒ˜๋ฆฌ ํ•ด์•ผ ํ•˜๋Š” ๋‚จ์€ ๋ฌผํ’ˆ ์—†์ด ๋‹ค๋…€ ์™€์•ผ ํ•˜๋Š” ํšŸ์ˆ˜, ๋‘˜ ์ค‘ ๋” ํฐ ์ˆ˜๋กœ ๊ฒฐ์ •
        cnt = max(deliver_cnt, pickup_cnt)
        remain_deliver -= cnt * cap
        remain_pickup += cnt * cap
        distance += (i + 1) * cnt * 2  # ๊ฑฐ๋ฆฌ ๋”ํ•˜๊ธฐ (์™•๋ณต)
    return distance