[7/3] 구명보트

이경준·2021년 7월 3일
0

코테

목록 보기
59/140
post-custom-banner

레벨2 (실패) 문제

내 코드

(코드는 잘 작동하지만, 효율성에서 탈락)

def solution(people, limit):
    
    ship = 0
    people.sort(reverse = True)
    
    while people:
        
        if ( len(people) >= 2 and people[0] + people[-1] <= limit):
            del people[0]
            del people[-1]
            ship += 1
        else:
            del people[0]
            ship += 1
    
    return ship

로직

  • 최대 2명까지 탑승할 수 있다는 것을 안 보고 문제를 풀었다...
  • 리스트를 오름차순으로 정렬하고, 정원이 초과되거나 무게가 초과되면 다음 보트에 태우는 로직을 생각했었는데 되지 않았다. 계속 고민하다가 결국 구글링을 했다.
  1. 오름차순 정렬
  2. people 리스트가 존재할 때까지 while문을 돌린다.
  3. 길이가 2 이상이고 (이 조건을 넣지 않으면 리스트에 하나 남았을때 오류가 발생), 처음과 마지막의 합이 limit 이하일 경우, 처음과 마지막 값을 제거한다. ship에 1을 더해준다.
  4. 그렇지 않으면, 처음 값을 제거한다. ship에 1을 더해준다.

효율적인 코드

def solution(people, limit):
    
    ship = 0
    people.sort(reverse = True)
    
    left = 0
    right = len(people) - 1
    
    while left <= right:
        
        if ( len(people) >= 2 and people[left] + people[right] <= limit):
            left += 1
            right -= 1
            ship += 1
        else:
            left += 1
            ship += 1
    
    return ship

피드백

  • del, remove, pop 등 리스트를 삭제하는 함수를 사용하면 시간 초과가 뜬다. 따라서 인덱스 값을 증감하는 방식으로 코드를 짰다.

  • while문 조건을 생각하는 것이 어려웠다.

  • 생각을 오래해도 로직이 떠오르지 않는다면, 다른 방법이나 다른 라이브러리를 사용하자!

profile
The Show Must Go On
post-custom-banner

0개의 댓글