알고리즘/프로그래머스

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

개발하는 호랑이 2024. 1. 30. 14:51

구명보트

풀이

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

우선 생각한대로 풀이는
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