문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/42885
1. 나의 풀이
function solution(people, limit) {
var sortedPeople = people.sort((a,b) => a-b);
let cnt = 0;
var i = 0;
var j = sortedPeople.length - 1;
while(i <= j) {
if(sortedPeople[i] + sortedPeople[j] <= limit) {
i++;
j--;
}
else {
j--;
}
cnt++;
}
return cnt;
}
- people 배열을 정렬한, sortedPeople 배열을 생성한다.
- 포인터 두 개를 생성한다. (i는 0, j는 sortedPeople의 맨 끝에)
- i가 j보다 작거나 같을 동안 계속 순회를 하면서
- 배열에서 가장 큰 값과 작은 값을 더한 값이 limit보다 작거나 같으면 i를 오른쪽으로 한 칸, j를 왼쪽으로 한 칸 옮긴다. → 가장 많은 몸무게를 가진 사람과 가장 적은 몸무게를 가진 사람을 같이 태운다는 뜻
- 만약 limit보다 크다면 j를 왼쪽으로 한 칸 옮긴다. → 가장 많은 몸무게를 가진 사람을 단독으로 태운다는 뜻
- 그리고 태울때마다 cnt를 1씩 더해준다.
- 더해진 cnt를 return한다.
순수하게 내 실력으로는 풀지 못하고 인터넷의 도움을 받았다. 이번 기회를 통해 투 포인터가 많이 유용하다는 것을 알게 되었다.
2. 다른 사람의 풀이
function solution(people, limit) {
let biggest = 0,
count = 0,
i = 0;
people.sort((a, b) => a - b);
while (people.length > 0) {
biggest = people.pop();
i = 0;
while (people[i] <= limit - biggest) i++;
if (i) people.splice(i - 1, 1);
count++;
}
return count;
}
- people 배열을 정렬한다.
- people 배열이 0이 될 때까지 무한루프를 돌리는데
- people[i]가 limit - biggest보다 작거나 같다면(같이 배에 탈 수 있다면) i를 1 더해준다.(무한루프)
- 루프에서 벗어나면 그리고 people 배열에서 people[i-1]을 제거하고 count를 1 더해준다.
- 그리고 people 배열이 0이 아니라면 위의 과정을 반복한다.
내 풀이가 가장 무거운 사람과 가장 가벼운 사람이 탈 수 있는지 검사하는 거였다면, 이 풀이는 사람들의 무게의 합이 limit에 가장 가깝게 유도를 하는 방법을 사용했다.
'Programmers(JavaScript)' 카테고리의 다른 글
[프로그래머스 자바스크립트] ‘최소직사각형’ 풀어보기 (2) | 2024.08.07 |
---|---|
[프로그래머스 자바스크립트] ‘K번째수’ 풀어보기 (0) | 2024.08.07 |
[프로그래머스 자바스크립트] ‘체육복’ 풀어보기 (0) | 2024.08.07 |
[프로그래머스 자바스크립트] ‘기능개발’ 풀어보기 (0) | 2024.07.17 |
[프로그래머스 자바스크립트] ‘같은 숫자는 싫어’ 풀어보기 (3) | 2024.07.17 |