문제

https://programmers.co.kr/learn/courses/30/lessons/42885?language=python3

풀이

조이스틱에서 피본거에 비하면 20분만에 쉽게 풀어낸 문제.
피본 덕분에 실력이 늘은건가?

from collections import deque
def solution(people, limit):
    dp = deque(sorted(people))
    answer = 0
    while len(dp) > 1:
        p1 = dp.popleft()
        p2 = dp.pop()
        
        if p1+p2 > limit:
            dp.appendleft(p1)
            
        answer += 1
            
    return answer + len(dp)

Deque 자료구조를 이용해서 무인도 명단을 정리 후
좌측에서 가장 가벼운 사람, 우측에서 가장 무거운 사람을 꺼냈다.

둘의 합이 limit보다 크면, 무거운 사람만 따로 보내고 가벼운 사람은 다시 명단 맨 앞에 넣는다. limit보다 작다면, 둘을 한꺼번에 보낸다.

이 작업을 무인도 명단에 단 한 사람이 남을 때까지 반복 시킨다.

더 나은 풀이

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

인덱스를 양쪽에서부터 좁혀오는 방법.
people 리스트에 pop 등의 연산이 일어나지 않기 때문에
속도가 굉장히 빠를 것으로 추측된다.

항상 리스트나 배열을 직접 건드리지 않고 해결 할 수 있는 문제들은
건드리지 않고 해결을 시도해야한다는 점을 기억하자.

댓글남기기