문제 풀이 정리
문제 설명
무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 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 |
코드
def solution(people, limit):
answer = 0
people = sorted(people, reverse=True)
left = 0
right = len(people) -1
while left <= right:
if people[left] + people[right] <= limit:
answer += 1
left+=1
right-=1
else:
answer += 1
left+=1
return answer
문제 넋두리
와...문제 설명이랑 입출력 예 보고 또 타자 연습수준이겠군 하고 덤볐다가 대가리 깨지는 줄 알았다.
첫번째 난관
문제를 똑바로 읽지 않은 내 잘못이다.
도저히 모르겠어서 찾아본 힌트 첫줄
그렇다 단 두명만 탈수있었다. 나는 탈 수 있다면 계속 태워서 문제가 됐었던 거다.
두번째 난관
먼저 낮은 애들끼리 내보내야 된다고 생각한게 잘못이였다.
가령 [20,40,60,80] limit 100 이라고 할때, [20,40] [60] [80] 이렇게 3번 움직이면 된다고 생각했다.
예 만 보더라도 이상함을 느낄수 있다. [20,80] [40,60] 이라면 2번만에 가능하다!
세번째 난관
그렇다면 배열을 정렬한뒤, 앞뒤로 더해서 limit 보다 작으면 둘이 내보내고, limit보다 크면 제일 큰 친구를 내보내자!
(이거 생각하는데만 해도 하루 다갔음)
그래서 코드로 나타내면
while len(peoples) != 0:
if len(peoples) == 1:
answer += 1
peoples.pop()
else:
for i in range(len(peoples)):
if peoples[i] + peoples[len(peoples)-1] <= limit:
answer += 1
peoples.pop(0)
peoples.pop()
break
else:
answer += 1
peoples.pop(0)
break
이렇게 짜고 채점을 해본 결과
효율성 테스트에서 시간초과 오류가 났었다...
자존심 상하지만 더이상 지체할 수 없다 여겨 힌트롤 봤다.
아.. left / right....
left = 0
right = len(people) -1
while left <= right:
if people[left] + people[right] <= limit:
answer += 1
left+=1
right-=1
else:
answer += 1
left+=1
이러면 배열을 순차적으로 돌수 있게 된다. (배열 * 배열 의 경우의 수가 줄어든다)
이렇게 오늘도 겨우겨우 하나를 풀어냈다.
'algorithm > programmers' 카테고리의 다른 글
캐시 [프로그래머스] (0) | 2021.05.12 |
---|---|
괄호 회전하기 [프로그래머스] (0) | 2021.05.11 |
이진 변환 반복하기 [프로그래머스] (0) | 2021.05.10 |
올바른 괄호 [프로그래머스] (0) | 2021.05.10 |
짝지어 제거하기 [프로그래머스] (feat. stack..) (0) | 2021.05.08 |
댓글