본문 바로가기
Algorithm

[Programmers] 42885.py 구명보트

by roses16 2023. 5. 31.

일단 출제된 문제 그대로 작성하였으나 역시나 효율성에서 탈락

 

def solution(people, limit):
    answer = 0
    sorted_people = sorted(people, reverse=True)

    while True:
        # 반복문 종료조건
        length = len(sorted_people)
        if length <= 1:
            answer += length
            break;

        # 혼자서 탈 수 밖에 없는 무게
        if sorted_people[0] + sorted_people[-1] > limit:
            count = sorted_people.count(sorted_people[0])
            answer += count
            sorted_people = sorted_people[count:]
        # 짝 지어주기
        else:
            answer += 1
            sorted_people = sorted_people[1:-1]

    return answer

 

매 반복마다 일부만 slice 된 배열을 다시 대입하는 점이 과하다 판단되어 slice 대신 left와 right값을 변수로 만들어 조정하는 방식을 사용하여 아래와 같이 해결

 

def solution(people, limit):
    answer = 0
    sorted_people = sorted(people, reverse=True)

    left = 0
    right = len(sorted_people)-1

    while True:

        length = right - left + 1

        # 반복문 종료조건
        if length <= 1:
            answer += length
            break

        # 혼자서 탈 수 밖에 없는 무게
        if sorted_people[left] + sorted_people[right] > limit:
            answer += 1
            left += 1

        # 짝 지어주기
        else:
            answer += 1
            left += 1
            right -= 1

    return answer