Algorithm/1일 1코테
[🥲 프로그래머스] 구명보트 - 탐욕법
대인보우
2021. 7. 25. 20:59
반응형
https://programmers.co.kr/learn/courses/30/lessons/42885
코딩테스트 연습 - 구명보트
무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5
programmers.co.kr
예전에 푼 문제인데 또 똑같이 시간초과함ㅋㅋㅋㅋㅋㅋ 인간은 망각의 동물......
✅ 내가 푼 풀이
# 1차시도 - 시간초과
def solution(people, limit):
people.sort()
count = 0
while people:
person = people.pop(0)
if not people:
count += 1
break
for i in range(len(people)-1,-1,-1):
if person+people[i] <= limit:
people.pop(i)
break
count += 1
return count
# 2차시도 - 통과
def solution(people, limit) :
answer = 0
people.sort()
left = 0 # people의 첫번째
right = len(people)-1 # people의 마지막
while left <= right:
# people의 가장 작은값과 큰 값이 합친 것이 limit보다 크다면 (1명만 탈 수 있다)
if people[left] + people[right] > limit:
right -= 1 # 큰 값을 한칸 앞으로 당겨줌
else:
# 같으면 작은 값은 한칸 위로, 큰 값은 한칸 앞으로 (2명이 탈 수 있다)
left += 1
right -= 1
answer += 1
return answer
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/021.gif)
꺼진 불도 다시 보자는 속담이 떠올랐다....
+ 이 문제 다시 풀었는데 같은 알고리즘이라도 리스트가 아니라 queue로 변경하면 속도가 빨라짐!
from collections import deque
def solution(people, limit):
count = 0
people.sort(reverse=True)
people = deque((people))
while people:
p = people.popleft()
if not people:
count += 1
break
if people[-1] + p <= limit:
people.pop()
count += 1
return count
반응형