Better Code, Better Life

라면공장 - 프로그래머스 - 파이썬 풀이 본문

Coding Test/Programmers

라면공장 - 프로그래머스 - 파이썬 풀이

심재훈 2019. 8. 7. 06:00

문제 풀이

최대한 밀가루를 많이 공급해주는 해외 공장을 찾아야 합니다.

하지만 그 날까지 밀가루가 충분히 있어야 합니다.

버틸 수 있는 날 중에서 위 조건의 해외 공장을 찾아줍시다.

위 과정을 목표 수량에 달성할 때까지 반복합니다.

 

위 조건의 해외 공장을 찾으려면 max-heap 구조를 이용해야 합니다.

파이썬의 heapq 모듈은 기본적으로 min-heap이기 때문에

자료 값에 -1를 곱해주면 max-heap처럼 다룰 수 있습니다.

이후 최소값을 뽑으면 사실상 최대값이 뽑힙니다.

자료를 직접 다룰 때는 다시 -1를 곱해줍니다.

...
supplies = flip(supplies)
...
supply = supply_info[0]*(-1)

 

파이썬 heapq 모듈의 사용법은 help 키워드나 여기 링크를 참조하세요.

 

클린 코드 작성법

  1. 적절한 변수명을 붙여 문제의 이해도를 높입니다.

    1. stock -> start_stock
    2. k -> total_need_stock
  2. 문제 해결을 위해 중간 변수를 이용합니다.

    1. start_stock을 그대로 이용하기보다 새로운 변수(current_stock)를 활용합니다.
  3. while문 내에 반복되는 프로세스를 함수화하여 중첩을 줄입니다.

    1. get_supply

해답 코드

import heapq

def solution(stock, dates, supplies, k):
    start_stock = stock
    total_need_stock = k

    supplies = flip(supplies)
    supply_info_list = list(zip(supplies, dates))
    heapq.heapify(supply_info_list)

    supply_count = 0
    current_stock = start_stock
    while True:
        if total_need_stock <= current_stock:
            break
        supply_info = get_supply(current_stock, supply_info_list)
        supply = supply_info[0]*(-1)
        current_stock += supply
        supply_count += 1
    return supply_count

def flip(target):
    flipped = list(map(lambda x: x*(-1), target))
    return flipped

def get_supply(current_stock, supply_info_list):
    supply_candidates = []
    while True:
        supply_candidate = heapq.heappop(supply_info_list)
        supply_candidates.append(supply_candidate)
        supply, date = supply_candidate
        if date <= current_stock:
            supply_info = supply_candidate
            supply_candidates.pop()
            break
    for supply_candidate in supply_candidates:
        heapq.heappush(supply_info_list, supply_candidate)
    return supply_info

도움이 됐다면 공감버튼을 눌러주세요! 질문이 있다면 댓글 달아주세요!

 

문제 링크

 

코딩테스트 연습 - 라면공장 | 프로그래머스

라면 공장에서는 하루에 밀가루를 1톤씩 사용합니다. 원래 밀가루를 공급받던 공장의 고장으로 앞으로 k일 이후에야 밀가루를 공급받을 수 있기 때문에 해외 공장에서 밀가루를 수입해야 합니다. 해외 공장에서는 향후 밀가루를 공급할 수 있는 날짜와 수량을 알려주었고, 라면 공장에서는 운송비를 줄이기 위해 최소한의 횟수로 밀가루를 공급받고 싶습니다. 현재 공장에 남아있는 밀가루 수량 stock, 밀가루 공급 일정(dates)과 해당 시점에 공급 가능한 밀가루 수량

programmers.co.kr

 

Comments