๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“š Coding Test

์Šค์ฝ”๋นŒ ์ง€์ˆ˜

by ํ‹ด๋”” 2020. 8. 3.
728x90
๋ฐ˜์‘ํ˜•
 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋” ๋งต๊ฒŒ

๋งค์šด ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š” Leo๋Š” ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K ์ด์ƒ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K ์ด์ƒ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Leo๋Š” ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ๋‘ ๊ฐœ์˜ ์Œ์‹์„ ์•„๋ž˜์™€ ๊ฐ™๏ฟฝ๏ฟฝ

programmers.co.kr

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต์—์„œ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ž˜ ๋ณด๋ฉด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ๊ฐ€ ์ ํ˜€ ์žˆ๋‹ค. ์ด๋ฒˆ์— ํ•˜๊ฒŒ ๋œ ๊ฒƒ์€ ํž™(Heap) > ๋” ๋งต๊ฒŒ ์ด๋‹ค. ์ž‘์€ ์ˆ˜์™€ ๊ทธ ๋‹ค์Œ ์ž‘์€ ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์—ฐ์‚ฐ์„ ํ•˜๊ณ  ๋‹ค์‹œ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ์–ด์„œ ์ตœ์†Œ๊ฐ’ ๊ธฐ์ค€์— ๋Œ€ํ•œ ์กฐ๊ฑด๋งŒ ๋งž์ถ”๋ฉด ๋˜๊ฒ ๋‹ค ์‹ถ์—ˆ์œผ๋‚˜ ํšจ์œจ์„ฑ์—์„œ ๊ณผ๊ฐํžˆ ์•„์›ƒ๋‹นํ–ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์—ฌ๊ธฐ์„œ 'ํž™'์„ ์ œ์‹œํ•œ ๊ฑธ๊นŒ?

 

์Šคํƒ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ฑธ๊นŒ?

def solution(scovile, k):
    answer = 0 
    while min(scovile) < k :
        if len(scovile) == 1 :
            answer = -1 
            break;

        index = scovile.index(min(scovile))

        first_min = scovile.pop(index)
        index_two = scovile.index(min(scovile))
        second_min = scovile.pop(index_two)
        new_food = first_min + (second_min * 2)
        
        scovile.append(new_food)        
        answer += 1
    
    return answer

ํŒŒ์ด์ฌ์—์„œ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์Šคํƒ ๊ตฌ์กฐ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์Šคํƒ ๊ตฌ์กฐ๋Š” ๋งˆ์ง€๋ง‰์— ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ž…๊ตฌ๊ฐ€ ํ•˜๋‚˜๋ฐ–์— ์—†๋Š” ๊ตฌ์กฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๋บ€๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค.

 

list.pop([i])

์ด ๋ฉ”์†Œ๋“œ๋Š” i ๋ฒˆ์งธ ์ธ์ž๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋™์‹œ์— ๊ทธ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ์œ„ ํ‘œํ˜„์€ ํŒŒ์ด์ฌ์˜ document๋ฅผ ์ฐธ๊ณ ํ•œ ๊ฒƒ์ธ๋ฐ ์ค‘๊ด„ํ˜ธ๋ฅผ ์ ์–ด์•ผ ํ•จ์„ ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ i๋ผ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ ์–ด๋„ ๋˜๊ณ  ์•ˆ ์ ์–ด๋„ ๋˜๋Š” ์˜ต์…”๋„ ๊ฐ’์ด๋ผ๋Š” ๋œป์ด๋‹ค. ์ธ๋ฑ์Šค๋ฅผ ์ ์ง€ ์•Š์œผ๋ฉด ์ œ์ผ ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” ๊ฐ’์„ ์‚ญ์ œํ•˜๋Š” ๋™์‹œ์— ๋ฆฌํ„ดํ•œ๋‹ค. 

 

list.append(x)

append ๋ฉ”์†Œ๋“œ๋Š” list์— ๊ฐ’ x๋ฅผ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ์ถ”๊ฐ€ํ•œ๋‹ค. 

 

pop()๊ณผ append() ๋ฉ”์†Œ๋“œ๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํƒ ๊ตฌ์กฐ์™€ ๊ฐ™์ด ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ด์ œ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด pop() ๋ฉ”์†Œ๋“œ์™€ min() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ๋ฐ˜ํ™˜ ๋ฐ›์€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ž‘์€ ๊ฐ’์„ ์ฐพ๋Š” ์ •๋ ฌ์ด ์ˆ˜ํ–‰๋˜์•ผ ํ•˜๊ณ  ๊ทธ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ’์„ ๋ฐ˜ํ™˜ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ์„ ์ด์šฉํ•œ ๊ฒƒ๋„ ์•„๋‹ˆ๊ฒŒ ๋œ๋‹ค.  

 

์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ๋Š” ๋ชจ๋‘ ํ†ต๊ณผํ–ˆ์ง€๋งŒ ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ๋กœ ๋ชจ๋‘ ์‹คํŒจํ•˜๊ณ  ๋ง์•˜๋‹ค. ์—ฌ๊ธฐ์„œ ์ตœ์†Œ๊ฐ’์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ์ŠคํŠธ ๋‚ด๋ถ€์—์„œ ์ •๋ ฌ์ด ๋“ค์–ด๊ฐ„๋‹ค. ์ด ์ตœ์†Œ๊ฐ’์ด ์ œ์‹œ๋œ k์˜ ๊ฐ’ ์ด์ƒ์ด ๋  ๋•Œ๊นŒ์ง€ while๋ฌธ์„ ๋ฐ˜๋ณตํ•˜๋ฏ€๋กœ ๊ธด ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์‹œ๊ฐ„ ํšจ์œจ์„ฑ ์ธก๋ฉด์—์„œ ์‹คํŒจํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์ฒ˜์Œ์— ์ด ๋ฌธ์ œ๋Š” 'ํž™' ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋ถ„๋ฅ˜ ๋˜์—ˆ์„๊นŒ?

 

์Šคํƒ ๋ง๊ณ  ํ

ํ๋Š” ์„ ์ž…์„ ์ถœ์˜ ๋Œ€ํ‘œ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์ฒ˜์Œ ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜์Œ์œผ๋กœ ๋ฐ˜ํ™˜ ๋ฐ›์„ ์ˆ˜ ์ž‡๋‹ค. enqueue๋Š” ๋ฐ์ดํ„ฐ ์ž…๋ ฅ์„, dequeue๋Š” ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ์„ ์˜๋ฏธํ•˜๋ฉฐ ์ด ๋˜ํ•œ list๋ฅผ ํ†ตํ•ด์„œ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด collections.deque ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

from collections import deque

๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์‹œ ์ฃผ์˜ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ์šฐ์„  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌ์ŠคํŠธ์˜ ๋์—์„œ ์ถ”๊ฐ€ํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ๋น ๋ฅด์ง€๋งŒ, ๋ฆฌ์ŠคํŠธ์˜ ์•ž ๋ถ€๋ถ„์—์„œ ์ถ”๊ฐ€ํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ๋Š๋ฆฌ๋‹ค. ๋ฆฌ์ŠคํŠธ์˜ ์•ž ๋ถ€๋ถ„์—์„œ ๋ฐ”๊ฟ” ์ค€๋‹ค๋ฉด ๊ฐ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ์š”์†Œ๋“ค์˜ ์œ„์น˜๋ฅผ ์•ž์œผ๋กœ ํ•œ์นธ ์”ฉ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ํ˜น์€ ๋’ค๋กœ ๋ฐ€์–ด์•ผ ํ•˜๋Š”  ์ƒํ™ฉ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Š๋ฆฌ๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

์ด ๋ฌธ์ œ์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์€ ์ž‘์€ ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค. ๋‘๊ฐœ์˜ ์ž‘์€ ๊ฐ’์„ ์ฐพ์•„์„œ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋” ํฐ ๊ฐ’์„ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค. ์—ฌ๊ธฐ์„œ ์ƒ๊ฐ๋‚˜๋Š” ๊ฒƒ์€ ๋ฐ”๋กœ 'ํž™'!

 

ํŒŒ์ด์ฌ์˜ ํž™์€ ์ž‘์€ ๊ฐ’ ๋ถ€ํ„ฐ ์ •๋ ฌ๋˜๋Š” ์šฐ์„ ์ˆœ์œ„ ํž™

ํŒŒ์ด์ฌ์—์„œ๋Š” ํž™ ํ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•œ heapq.py ๋ผ๋Š” ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ ‘ํ•˜๋Š” ํž™ ๋ฐฐ์—ด์€ ๊ฐ’์ด ํฌ๊ณ  ์ธ๋ฑ์Šค๋Š” ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ ์ˆœ์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŒŒ์ด์ฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํž™์€ ๊ทธ ๋ฐ˜๋Œ€๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. heapq์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ ๋ช‡ ๊ฐ€์ง€๋ฅผ ์•Œ์•„๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

 

heapq.heappop(heap)

์ด ๋ฉ”์†Œ๋“œ๋Š” ํž™์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์‚ญ์ œํ•œ ๋’ค ๋ฆฌํ„ดํ•œ๋‹ค. ์ด๋•Œ ๋ฆฌ์ŠคํŠธ์˜ pop๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ pop์„ ํ•˜๊ณ  ๋‚œ ๋’ค์—๋„ ํž™์˜ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ heappop์„ ํ†ตํ•ด์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ ๋‘๊ฐœ๋ฅผ ๋ฐ˜ํ™˜ ๋ฐ›๊ธฐ ์œ„ํ•ด ์—ฐ์†์ ์œผ๋กœ pop์„ ๋‘ ๋ฒˆ ์‚ฌ์šฉํ•ด๋„ ํž™ ๊ตฌ์กฐ๊ฐ€ ์œ ์ง€ ๋˜๋Š” ๊ฒƒ์ด๋ฉฐ ์ด๋Š” ์•ž์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์—์„œ min() ์„ ํ†ตํ•ด ์ตœ์†Œ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ •๋ ฌ์„ ์‹œ๋„ํ•˜๋Š” ์ผ์ด ์—†์–ด๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. 

์—ฌ๊ธฐ์— ๋” ์ข‹์€ ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

heapq.heappushpop(heap, item)

item์„ heap์— ์ถ”๊ฐ€์‹œํ‚ค๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค. ์ด๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์„œ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๊ตฌํ•œ ๊ฐ’์„ ์›๋ž˜ ํž™์— ๋‹ค์‹œ append ์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค. 

 

IndexError 

heapq.heappop(heap)์€ ๋”์ด์ƒ popํ•  ๊ฐ’์ด ์—†๋Š”, ์ฆ‰ ๋นˆ ํž™์—์„œ pop์„ ํ•  ๊ฒฝ์šฐ IndexError๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค. 

๋งŒ์•ฝ ๋” ์ด์ƒ ์ž‘์€ ๋‘ ๊ฐœ์˜ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์•„์„œ ๊ธฐ์ค€์— ๋งž๋Š” ์ƒˆ๋กœ์šด ํฐ ๊ฐ’์„ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ -1์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— indexError๊ฐ€ ์ผ์–ด๋‚œ ๊ฒฝ์šฐ try{} exception{}์„ ํ†ตํ•ด์„œ -1์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

import heapq

def solution(scovile, k):
    answer = 0
    h = []
    
    for i in scovile:
        heapq.heappush(h, i)
    # it is like that...
    # heapq.heapify(scovile)
    try :
        min_val = heapq.heappop(h)
        while min_val < k: 

            min_val = heapq.heappushpop(h, min_val + heapq.heappop(h) * 2)
            answer += 1

        return answer
        
    except IndexError :
        
        return -1
        
scovile = [1, 2, 3, 9, 10, 12]
k = 7

theAnswer = solution(scovile, k)
print(theAnswer)

 

 

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€