Python/프로그래머스

구명보트

룰루랄라룰루랄라 2024. 3. 25. 21:00

무인도에 갇힌 사람들을 구하려고 하는데, 사람들의 무게도 다르고 구명보트도 무게제한이 있고 최대 2명 까지 가능하다

사람들 무게 리스트를 받아서 구명보트를 최소한으로 쓸 때, 구명보트 수를 결과값으로 내야하는 문제!

음.. 우선 최대 2명이고, 제한이 있는 구명보트 무게라고 하니.. 두 배열의 원소를 각 곱해서 전체 합이 가장 작은 경우를 구해라는 문제가 생각났다..

결국 무거운 사람 둘을 엮으면 구명보트 제한으로 2개가 나갈것이지만, 무거운 사람 + 가벼운 사람으로 엮으면 1개만으로 가능한 경우가 많을 것..

처음부터 가벼운+가벼운 으로 엮으면 뒤에는 무거운 사람들은 모두 1개씩 타고 나갈지도 모른다..!

그럼 결국 가벼운+무거운 의 짝으로 제한을 체크하고, 안되면 무거운 사람 1개 먼저 타세요! 해야하는 것이다..!!

 

처음에는 정렬 후 리스트를 그대로 썼는데.. 뭔가 시간상 오류가 떴다..

그래서 뭐가 있을까 하다가 본것이..

"deque" 이다! 양방향 입출이 가능한 큐! collections 에서 임포트 할 수 있다

이게 pop 뿐 아니라 popleft 까지 가능하고, 리스트보다 훨씬 시간적으로 효율이 좋다고 한다..!

그래서~

최종 코드는 이렇다

from collections import deque

def solution(people, limit):
    
    answer=0
    people.sort() # 가벼운 사람부터 정렬
    dq = deque(people) # deque 로 사용
    
    while dq:
        if len(dq)>=2: # 엮을 사람이 있다면
            if dq[0]+dq[-1]<=limit:
                dq.pop()
                dq.popleft()
                answer+=1
            else:
                dq.pop()
                answer+=1
                
        else: # 없으면 혼자 가야됨
            dq.pop()
            answer+=1

    return answer

 

처음엔 가벼운 사람끼리도 엮어보고 하다가 시간 오류로 많이 틀렸다 ㅎㅎ

그래도.. 끝....!

 

 

출처 : https://school.programmers.co.kr/learn/challenges

'Python > 프로그래머스' 카테고리의 다른 글

귤 고르기  (0) 2024.03.25
예상 대진  (1) 2024.03.25
카펫  (0) 2024.03.25
피보나치 수  (0) 2024.03.25
도넛과 막대 그래프  (0) 2024.03.21