무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다.
예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 50kg]이고 구명보트의 무게 제한이 100kg이라면 2번째 사람과 4번째 사람은 같이 탈 수 있지만 1번째 사람과 3번째 사람의 무게의 합은 150kg이므로 구명보트의 무게 제한을 초과하여 같이 탈 수 없습니다.
구명보트를 최대한 적게 사용하여 모든 사람을 구출하려고 합니다.
사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 무인도에 갇힌 사람은 1명 이상 50,000명 이하입니다.
- 각 사람의 몸무게는 40kg 이상 240kg 이하입니다.
- 구명보트의 무게 제한은 40kg 이상 240kg 이하입니다.
- 구명보트의 무게 제한은 항상 사람들의 몸무게 중 최댓값보다 크게 주어지므로 사람들을 구출할 수 없는 경우는 없습니다.
입출력 예
people limit return
[70, 50, 80, 50] | 100 | 3 |
[70, 80, 50] | 100 | 3 |
문제 이해
- 몸무게 제한에 따라 보트에 승객을 태우는 문제입니다.
- 단, 보트는 2명까지만 탑승할 수 있으며, 2명의 무게는 제한 중량을 넘지 않아야 합니다.
문제 풀이
1. 효율성테스트 통과 x
- 배열을 내림차순으로 정렬 후 limit에서 가장 오른쪽 사람의 몸무게를 빼고 newlimit을 생성합니다.
- 나머지 사람들을 반복문을 돌며 newlimit보다 작거나 같으면 보트에 방금 사람과 함께 태우고, 아니라면 혼자서만 태웁니다.
- 정답은 맞추나, 효율성 테스트(시간복잡도)에서 실패입니다.
2. 효율성 테스트 통과 o
- 오름차순 정렬 후, 투포인트 알고리즘을 이용합니다.
- left를 0으로, right를 사람수-1 의 인덱스로 두고, 조건에 따라 이동시키며 값을 찾습니다.
- left와 right가 제한 중량을 넘으면 right 한 사람만 보트에 태우고 right를 왼쪽으로 이동시킵니다.
- 만약 left와 right가 같은 사람을 가리키고 있으면, 승객이 한 명만 남은 것이므로 그 사람만 보트에 태우고 종료합니다.
코드
#프로그래머스 lv2 구명보트
def solution(people, limit):
#두번째 풀이
count = 0
people.sort()
left = 0
right = len(people)-1
while left<=right:
if left == right:
count += 1
break
if people[left] + people[right] <=limit:
left += 1
right -= 1
count += 1
# 첫번째 풀이
# people.sort(reverse=True)
# while people:
# if len(people) == 1:
# count += 1
# break
# newlimit = limit
# pick = people.pop()
# newlimit -= pick
# for i in range(len(people)):
# if people[i] <= newlimit:
# people.pop(i)
# break
# count += 1
return count
print(solution([70, 50, 80, 50],100))
'알고리즘 풀이 > Python' 카테고리의 다른 글
[Python] 효율적인 해킹 (백준 1325 파이썬) (0) | 2023.08.24 |
---|---|
[Python] 큰 수 만들기 (프로그래머스 Lv2 파이썬) (0) | 2023.08.24 |
[Python] 나이트의 이동 (백준 7562번 파이썬) (0) | 2023.08.23 |
[Python] 문자열 내 마음대로 정렬하기 (프로그래머스 Lv1 파이썬) (0) | 2023.08.22 |
[Python] 숫자의 표현 (프로그래머스 Lv2 파이썬) (0) | 2023.08.21 |