본문 바로가기
알고리즘/프로그래머스

프로그래머스 Lv2 구명보트 (python)

by 개발하는 호랑이 2024. 1. 30.

구명보트

풀이

보고나서 머리로는 어떻게 풀어야겠다 생각되었으나, 코드로 어떻게 해야할지 고민이 되었다.

우선 생각한대로 풀이는
1. 받은 인원을 무게 내림차순으로 정렬한다.
2. 보트를 타야하는데 남은 사람 중 가장 무거운 사람과 가장 가벼운 사람을 태운다.
2-1. 이 때 가장 무거운 사람+ 가벼운 사람 무게가 무게 제한에 걸리면 무거운 사람만 태운다.
3. 다시 2를 반복한다.
4. 2번을 반복한 횟수를 출력한다.

여기서 2번을 구현하려는데 for문을 안될 것 같고, while문을 이용해서 i와 j 인덱스 2개를 사용했다.
이렇게 가장 무거운 쪽에서 그리고 가장 가벼운 쪽에서 각각 진출할 수 있게 만들었다.

# 무게 제한과 최대 2명
# 최대한 적게 사용해 모든 사람 구출
# 몇 번 사용했는지 반환
# 사람의 몸무게와 보트 무게 제한은 40kg~240kg
# 남은 사람 중 가장 무거운 사람과, 가장 가벼운 사람을 같이 데리고 가자.
# 2명을 못 태우고 가면 먼저 무거운 사람 먼저.
def solution(people, limit):
    answer = 0
    n = len(people)
    people_sort = sorted(people, reverse=True)
    # 구명 보트에 태울 수 있는 가장 몸무게 많은 사람과 적은 사람을 선택하기
    i = 0
    j = n-1
    count = 0
    while i<=j:
        # 남은 사람중 가장 무거운 사람과 적은 사람의 합이 limit보다 적으면
        if people_sort[i] + people_sort[j] <= limit:
            count += 1
            i += 1
            j -= 1
            continue
        elif people_sort[i] + people_sort[j] > limit:
            count += 1
            i += 1
            continue
    return count

다른 사람 풀이

근본적인 풀이는 내가 생각한 것과 별반 다르지 않은 풀이법이다. 다만 좀 더 간단하다.

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