[프로그래머스] 구명보트 - python 본문

코테 문제 풀이

[프로그래머스] 구명보트 - python

미니모아 2022. 4. 9. 00:07
반응형

구명보트

문제 설명

무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다.

구명보트를 최대한 적게 사용하여 모든 사람을 구출하려고 합니다.

사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 무인도에 갇힌 사람은 1명 이상 50,000명 이하입니다.
  • 각 사람의 몸무게는 40kg 이상 240kg 이하입니다.
  • 구명보트의 무게 제한은 40kg 이상 240kg 이하입니다.
  • 구명보트의 무게 제한은 항상 사람들의 몸무게 중 최댓값보다 크게 주어지므로 사람들을 구출할 수 없는 경우는 없습니다.

풀이

처음에는 몸무게가 가장 작은 순으로 먼저 꺼내면 어떨까 했는데 [40, 40, 50, 60]에서 lmit가 100일 경우 (40, 40), (50), (60) 보다 (40, 60), (40, 50)으로 꺼내는 게 더 최솟값이라서 안된다는 것을 알았다.

그래서 투포인터를 사용해서 최소값과 최대 값이 limit 이하인 조합을 먼저 꺼내고 만약 limit 이하인 게 없다면 하나만 꺼내고 탐색을 종료하도록 했다. 이때 남은 사람은 무조건 한 명씩 밖에 탈 수 없으므로 남은 사람의 수를 더해줬다.

def solution(people, limit):
    answer = 0
    people.sort()
    start = 0
    end = len(people) - 1
    escape = 0
    
    while start <= end :
        if start == end: # 혼자서만 탈 수 있을 경우
            escape += 1
            answer += 1
            break
        
        if people[start] + people[end] <= limit: # 두명 다 태울 수 있는 경우
            start += 1
            answer += 1
            escape += 2
        end -= 1
    
    answer += len(people) - escape # 남은 인원 더하기
    return answer

다른 사람 풀이

마찬가지로 투포인터인데 전체 인원에서 짝이된 수를 빼서 훨씬 간단해졌다.

def solution(people, limit) :
    answer = 0
    people.sort()
​
    a = 0
    b = len(people) - 1
    while a < b :
        if people[b] + people[a] <= limit :
            a += 1
            answer += 1
        b -= 1
    return len(people) - answer
반응형
Comments