문제
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 등의 연산이 일어나지 않기 때문에
속도가 굉장히 빠를 것으로 추측된다.
항상 리스트나 배열을 직접 건드리지 않고 해결 할 수 있는 문제들은
건드리지 않고 해결을 시도해야한다는 점을 기억하자.
댓글남기기