문제 내용 요약
무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다.
예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 50kg]이고 구명보트의 무게 제한이 100kg이라면 2번째 사람과 4번째 사람은 같이 탈 수 있지만 1번째 사람과 3번째 사람의 무게의 합은 150kg이므로 구명보트의 무게 제한을 초과하여 같이 탈 수 없습니다.
구명보트를 최대한 적게 사용하여 모든 사람을 구출하려고 합니다.
사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 무인도에 갇힌 사람은 1명 이상 50,000명 이하입니다.
- 각 사람의 몸무게는 40kg 이상 240kg 이하입니다.
- 구명보트의 무게 제한은 40kg 이상 240kg 이하입니다.
- 구명보트의 무게 제한은 항상 사람들의 몸무게 중 최댓값보다 크게 주어지므로 사람들을 구출할 수 없는 경우는 없습니다.

내가 푼 방법
나름대로 풀긴 풀었는데..결과가 좋지않았다..이런식으로 푸는게 아닌거 같다.
def solution(people, limit): people = sorted(people, reverse = True)
people = sorted(people, reverse = True)
num = 1
count = 0
# people 크기가 0보다 작으면 조건 탈출
while len(people) > 0:
# 일단 limit와 같은 값 제거해주고
if people[0] == limit:
people.pop(0)
count += 1
continue
# 크기가 1 일때는 마지막 1명이므로 count늘려주면서 탈출
if len(people) == 1:
people.pop(0)
count += 1
break
# 가장 큰 값부터 뒤로 탐색하면서 limit값 안넘으면 조건 탈출
# 더한 값들은 최대한의 보트 탈 수 있는 인원으로 저장
val = people.pop(0)
a_list = []
for j in range(len(people)):
if val + people[j] <= limit:
val += people[j]
a_list.append(people[j])
저장된 리스트에 있는 people에서 제거하고 count 1더함
for v in a_list:
people.remove(v)
count += 1
answer = count
return answer
문제 해석
Limit에 가장 근사한 값을 찾아 주는 것이 핵심.
People 리스트 내에서 가장 무거운 사람과 가장 가변 사람의 합이 limit보다 작으면 작은 사람을을 계속 추가하는 방식
- 의미를 해석해보면
1) 일정 무게 이상 나가는 사람은 혼자 탈 수 밖에 없기 때문에
Ex. imit - 몸무게 < 40(몸무게 제한 40이상 240이하) 이 사람을 먼저 태워보냄
2) 몸무게 - limit >= 40 를 가진 사람은 40kg 이상인 사람을 더 태울수가 있음
Ex. [80, 60, 50, 40], limit = 100 // 100 - 80 = 20 <- 제한에 걸림 // 100 - 60 = 40 <- 제한에 안걸림, 40 Kg인원을 한명 더 태울 수 있음
3) 위의 방식 반복하면서 사람이 빠질 때 보트 갯수를 늘려가며 리스트길이가 0이 될 때 까지 반복
from collections import deque
def solution(people, limit):
answer = 0
que = sorted(people, reverse = True)
que = deque(que)
count = 0
while len(que) > 0:
if que[0] == limit:
que.popleft()
count += 1
continue
val = que[0]
if len(que) <= 1:
count += 1
break
while val + que[-1] <= limit:
if len(que) <= 1:
break
val = val + que.pop()
que.popleft()
count += 1
answer = count
return answer
깨달은 것
'공부 > 알고리즘' 카테고리의 다른 글
코테, 코딩 테스트 재귀 함수(DFS, BFS활용) 정리 - [재귀함수/알고리즘] (0) | 2022.06.09 |
---|---|
9663 문제 python N-Queen [백준-골드4/백트래킹] (0) | 2022.06.08 |
2609문제 python - [백준-실버5/최대공약수 최소공배수] (0) | 2022.06.01 |
큰 수 만들기 python - [프로그래머스/그리디 알고리즘] (0) | 2022.06.01 |
10815문제 python - [백준-실버4/이분탐색] (0) | 2022.06.01 |