Algorithm/programmers/greedy /level2/ 구명 보트(with python)

yellow·2021년 6월 28일
0

알고리즘 문제

목록 보기
54/58

📖 문제

📝 풀이 과정

  1. 사람들을 무게순으로 오름차순으로 정렬한다.
  2. 가장 무거운 사람의 무게 + 가장 가벼운 사람의 무게를 구해서 인자로 주어진 limit과 비교한다.
    2-1. limit이 크다면 가장 무거운 사람과 가장 가벼운 사람이 한 보트에 같이 탈 수 있다.
    2-2. limit이 작다면 가장 무거운 사람은 혼자 보트에 타야한다.
  3. 사람이 한명 남았을 때는 그 사람은 혼자 보트에 타게 된다.

⌨ 코드

def solution(people, limit):
    answer = 0
    people.sort()

    # two pointer
    l = 0
    r = len(people)-1
    while l <= r:
        # 마지막 한 명이 남게된다면 그 한명을 보트에  태우고 종료
        if l == r:
            answer += 1
            break
            
        tmp = people[l] + people[r]
        if tmp <= limit:
            l += 1
            r -= 1
            answer += 1
        # 가장 무게가 많이 나가는 사람 한명을 보트에 태운다.
        else:
            r -= 1
            answer += 1
    return answer

😊 느낀점

사람들을 보트에 태울 때마다 리스트 people 삭제하도록 pop()연산자를 많이 썼다. 이게 맨 마지막 원소만 제거했다면 시간복잡도에 문제가 없었겠지만, 가장 가벼운 사람을 보트에 태우는 경우에는 pop(0)을 해야 하는데 이는 O(N)의 시간복잡도이기 때문에 시간 초과가 발생했다.
이를 해결하는 좋은 방법은 two pointer라는 것을 알게 되었다.

profile
할 수 있어! :)

0개의 댓글