๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป CS

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๋Š” ํŠธ๋Ÿญ, ์ฃผ์‹ ๊ฐ€๊ฒฉ, ๋” ๋งต๊ฒŒ

by dev.py 2022. 1. 19.

 

https://programmers.co.kr/learn/courses/30/lessons/42583

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๋Š” ํŠธ๋Ÿญ

ํŠธ๋Ÿญ ์—ฌ๋Ÿฌ ๋Œ€๊ฐ€ ๊ฐ•์„ ๊ฐ€๋กœ์ง€๋ฅด๋Š” ์ผ์ฐจ์„  ๋‹ค๋ฆฌ๋ฅผ ์ •ํ•ด์ง„ ์ˆœ์œผ๋กœ ๊ฑด๋„ˆ๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํŠธ๋Ÿญ์ด ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋ ค๋ฉด ์ตœ์†Œ ๋ช‡ ์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋Š”์ง€ ์•Œ์•„๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฆฌ์—๋Š” ํŠธ๋Ÿญ์ด ์ตœ๋Œ€ bridge_length๋Œ€ ์˜ฌ๋ผ๊ฐˆ

programmers.co.kr

 

class Truck :
    def __init__(self, weight):
        self.weight = weight
        self.time =0
        

def solution(bridge_length, weight, truck_weights):
    bridge = list()
    result_queue = []
    result_case_number = len(truck_weights)
    seconds = 0
    current_weight = 0
    while True:
        if bridge and bridge[0].time == bridge_length:
            out_truck = bridge.pop(0)
            result_queue.append( out_truck )
            current_weight -= out_truck.weight
        else :
            pass 
        if truck_weights and current_weight+ truck_weights[0]  <= weight:   
            enter_truck = Truck(truck_weights.pop(0))
            bridge.append(enter_truck)
            current_weight += enter_truck.weight
        else :
            pass
        for truck_bridge in bridge :
            truck_bridge.time += 1
        seconds += 1
        if len(result_queue) == result_case_number :
            break
        
    return seconds

๋‹ค๋ฆฌ์— ์˜ฌ๋ผ์™€ ์žˆ๋Š” ํŠธ๋Ÿญ์€ bridge ๋ฆฌ์ŠคํŠธ์— ์˜ฌ๋ ค, ์ง„ํ–‰์ƒํƒœ์™€ ๋ฌด๊ฒŒ๋ฅผ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค ๋งŒ๋“ค์—ˆ๊ณ , ๋Œ€๊ธฐํ•˜๋Š” ํŠธ๋Ÿญ์„ ํ๋ฅผ ์ด์šฉํ•ด ํ•˜๋‚˜์”ฉ ๋นผ๊ฐ€๋ฉด์„œ ์ง„ํ–‰์‹œ์ผฐ๋‹ค

 

https://programmers.co.kr/learn/courses/30/lessons/42584

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์ฃผ์‹๊ฐ€๊ฒฉ

์ดˆ ๋‹จ์œ„๋กœ ๊ธฐ๋ก๋œ ์ฃผ์‹๊ฐ€๊ฒฉ์ด ๋‹ด๊ธด ๋ฐฐ์—ด prices๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๊ฐ€๊ฒฉ์ด ๋–จ์–ด์ง€์ง€ ์•Š์€ ๊ธฐ๊ฐ„์€ ๋ช‡ ์ดˆ์ธ์ง€๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์„ธ์š”. ์ œํ•œ์‚ฌํ•ญ prices์˜ ๊ฐ ๊ฐ€๊ฒฉ์€ 1 ์ด์ƒ 10,00

programmers.co.kr

 

def solution(prices):
    answer = [0] * len(prices)
    days= 0
    prices_history = list()
    for current_price in prices :
        while True :
            if prices_history and prices_history[-1][1] > current_price:
                out = prices_history.pop(-1)
                answer[out[0]] = days - out[0]
            else :
                prices_history.append([days , current_price])
                break
        days +=1
    days -=1
    for result in prices_history :
        answer[result[0]] = days - result[0]

    return answer

 

์ „์ฒด ์ฃผ์‹ ๊ฐ€๊ฒฉ ๋ฐฐ์—ด์„ For ๋ฌธ์„ ๋Œ๋ฆฌ๋ฉด์„œ, ์Šคํƒ์— ํ˜„์žฌ ๊ฐ€๊ฒฉ์„ ๋„ฃ๊ธฐ์ „์— ์Šคํƒ์— ์žˆ๋Š” ๊ฐ’์ด ์˜ค๋Š˜๋ณด๋‹ค ๋‚ฎ์œผ๋ฉด pop ์‹œํ‚ค๋ฉฐ ์ง„ํ–‰ ์‹œ์ผฐ๊ณ ,

 

๋นผ๋‚ธ ์ฃผ์‹ ๊ฐ€๊ฒฉ๋“ค์˜ ๋‚ ์งœ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ answer ๋ฐฐ์—ด์— ๋„ฃ์—ˆ๊ณ ,

 

while๋ฌธ์ด ๋๋‚˜๊ณ ๋„ ๋‚จ์€ ๊ฐ’์€ days ๊ณ„์‚ฐํ•˜์—ฌ answer์— ๋„ฃ์—ˆ๋‹ค.

 

์ตœ๋Œ€ํ•œ for๋ฌธ ํ•œ ๋ฒˆ์— ์Šคํƒ, ์กฐ๊ฑด, ๋น„๊ต ๊นŒ์ง€ ๋„ฃ์–ด์„œ ์ง„ํ–‰ํ•˜๊ณ ์ž ํ•˜์˜€๋‹ค.

 

https://programmers.co.kr/learn/courses/30/lessons/42626

 

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

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

programmers.co.kr

 

 

import heapq

def solution(scoville, K):
    answer = 0
    heapq.heapify(scoville)
    while len(scoville) > 1 : 
        min_1 = heapq.heappop(scoville)
        if min_1 >= K :
            return answer
        
        else :
            min_2 = heapq.heappop(scoville)
            heapq.heappush(scoville, min_1+min_2*2)   
            answer += 1
    if heapq.heappop(scoville) >= K :
        return answer
    else :
        return -1

 

heap์„ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ python heapq ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„ ํ•˜์˜€๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ heapq ๋Š” ์ตœ์†Œ heap์œผ๋กœ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉฐ

 

heapify(), heapq.heappush(), heapq.heappop() 3๊ฐ€์ง€๋ฅผ ์ž˜ ์“ฐ๋ฉด ์ฝ”ํ…Œ ๋ฌธ์ œ ํ’€๊ธฐ์— ์ข‹์„ ๊ฑฐ ๊ฐ™๋‹ค

https://programmers.co.kr/learn/courses/30/lessons/42627

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋””์Šคํฌ ์ปจํŠธ๋กค๋Ÿฌ

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

programmers.co.kr

 

import heapq  
def solution(jobs):
    jobs = sorted(jobs, key=lambda x: (x[0], x[1]))
    number = len(jobs)
    time = 0
    process_time = 0
    ready_queue = list()
    is_process = False
    answer = 0
    while jobs or ready_queue :
        while jobs and time == jobs[0][0]:
            ready_queue.append(jobs.pop(0)[1])
        ready_queue.sort()
        if process_time <= 0 :
            is_process = False
        else :
            is_process = True
        if  is_process :
            pass
        elif ready_queue  :
            process_time = ready_queue.pop(0)
            answer += process_time
        answer += len(ready_queue)
        time += 1
        process_time -=1 
    return int(answer/number)

 

์‹œ๊ฐ„๋ณต์žก๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ์ค‘์š”ํ•œ ๋ฌธ์ œ์˜€๋‹ค.

 

๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋กœ ์˜ค๋ž˜ ๊ฑธ๋ ท๋Š”๋ฐ

 

์ฒซ ๋ฒˆ์งธ๋Š” ๊ฐ™์€ ์‹œ๊ฐ„์— ์ค‘๋ณต๋˜์„œ ์˜ฌ ๊ฒƒ์„ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.'

 

๋‘ ๋ฒˆ์จฐ๋Š” ๋‹น์—ฐํžˆ' ์‹œ๊ฐ„์ˆœ์„œ๋Œ€๋กœ ์˜ฌ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ณ 

 

์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” ๋น ๋ฅด๊ฒŒ ์ธ์ง€ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ณ ์ณค์ง€๋งŒ, ๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ๋ฅผ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ด๋ฆฌ์ €๋ฆฌ ๋ฐ”๊พธ๋‹ค ๋ณด๋‹ˆ 

 

๊ฒฐ๋ก ์ ์œผ๋กœ๋Š” ํ๋กœ ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ, ๋‚˜์ค‘์— ํž™์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋ณด๋‹ค ์ฝ”๋“œ๋„ ์งง๊ณ , ์‹œ๊ฐ„ํšจ์œจ์„ฑ๋„ ์ข‹๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์„ ๊ฑฐ ๊ฐ™๋‹ค.