Skip to content

Commit 5637e24

Browse files
committed
add: 프로그래머스/구명보트
1 parent 233c864 commit 5637e24

2 files changed

Lines changed: 65 additions & 0 deletions

File tree

programmers/구명보트/README.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# [구명보트 / 42885](https://programmers.co.kr/learn/courses/30/lessons/42885?language=javascript)
2+
## What
3+
###### Description
4+
5+
무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 **2명**씩 밖에 탈 수 없고, 무게 제한도 있습니다.
6+
7+
예를 들어, 사람들의 몸무게가 \[70kg, 50kg, 80kg, 50kg\]이고 구명보트의 무게 제한이 100kg이라면 2번째 사람과 4번째 사람은 같이 탈 수 있지만 1번째 사람과 3번째 사람의 무게의 합은 150kg이므로 구명보트의 무게 제한을 초과하여 같이 탈 수 없습니다.
8+
9+
구명보트를 최대한 적게 사용하여 모든 사람을 구출하려고 합니다.
10+
11+
사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 하도록 solution 함수를 작성해주세요.
12+
13+
##### 제한사항
14+
15+
* 무인도에 갇힌 사람은 1명 이상 50,000명 이하입니다.
16+
* 각 사람의 몸무게는 40kg 이상 240kg 이하입니다.
17+
* 구명보트의 무게 제한은 40kg 이상 240kg 이하입니다.
18+
* 구명보트의 무게 제한은 항상 사람들의 몸무게 중 최댓값보다 크게 주어지므로 사람들을 구출할 수 없는 경우는 없습니다.
19+
20+
##### 입출력 예
21+
22+
<table class="table"><thead><tr><th>people</th><th>limit</th><th>return</th></tr></thead><tbody><tr><td>[70, 50, 80, 50]</td><td>100</td><td>3</td></tr><tr><td>[70, 80, 50]</td><td>100</td><td>3</td></tr></tbody></table>
23+
> 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/courses/30/lessons/42885
24+
25+
## How
26+
구명보트 문제는 카테고리가 그리디로 되어있어서 그리디를 사용한다는 느낌으로 문제를 풀었다. 문제를 읽어보면 무게 제한에 대한 설명과 한 번에 최대 2명씩 밖에 타지 못한다는 제한도 존재한다. 이러한 단서를 기반으로 풀이를 생각해보았다.
27+
28+
아래와 같이 몸무게를 오름차순으로 정렬한다.(숫자가 정렬될 때 맨 앞의 글자를 기준으로 정렬되므로 아래와 같이 처리해줘야 함)
29+
30+
```javascript
31+
<array>.sort((a, b) => a - b);
32+
```
33+
34+
최소 무게와 최대 무게를 더했을 경우 limit 보다 작으면 효율적으로 구출할 수 있다. 오름차순 정렬을 해놨으므로 가장 앞과 가장 뒤의 값을 더해서 limit과 비교하면 된다.
35+
36+
간단하게 오름차순된 배열을 앞에서부터 순회하도록 반복문을 설정하였고 answer는 반복할 때 마다 증가하도록 하였다. 반복문 내부적으로 최소 무게, 최대 무개의 합이 limit보다 작은 경우 last 인덱스를 1 줄였고 limit보다 큰 경우 똑같이 last 인덱스를 1 줄이면서 front 인덱스를 한번 더 비교하도록 처리하였다.
37+
38+
위의 반복문 순회가 끝난 후 answer값이 필요한 구명보트의 개수이다.
39+
40+
## Retrospective
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
function solution(people, limit) {
2+
people = people.sort((a, b) => a - b);
3+
4+
let answer = 0;
5+
let last = people.length - 1;
6+
7+
for (let front = 0; front <= last; front++, answer++) {
8+
if (front !== last && people[front] + people[last] > limit) {
9+
front--;
10+
last--;
11+
continue;
12+
}
13+
if (people[front] + people[last] <= limit) {
14+
last--;
15+
continue;
16+
}
17+
}
18+
19+
return answer;
20+
}
21+
22+
test('Test case', () => {
23+
expect(solution([70, 50, 80, 50], 100)).toEqual(3);
24+
expect(solution([70, 80, 50], 100)).toEqual(3);
25+
});

0 commit comments

Comments
 (0)