-- 문제
https://school.programmers.co.kr/learn/courses/30/lessons/42885
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
-- 최초 풀이
function solution(people, limit) {
let cnt = 0;
people.sort((a, b) => a - b);
while (people.length >= 2) {
if (people[0] + people[people.length - 1] <= limit) {
people.pop();
people.shift();
}
else {
people.pop();
}
cnt++;
}
return cnt + people.length; // 여기서 people.length는 0 or 1
}
-- 접근 방법
people 배열을 오름차순 정렬한 후,
people.length 가 2 미만이 될 때까지 (1명 남으면 혼자 배 타고 가면 되므로 최종 결과에 +1 만 하면 됨) while loop 한다.
(case 분류)
1. people의 첫 원소와 마지막 원소의 합이 limit을 넘지 않는다 => 2명이 탈 수 있음 => pop(), shift() 연산
2. limit을 넘는다 => 2명이 탈 수 없음 => pop() 연산
그리고, cnt++ 을 loop 마지막에 해준다.
핵심은 "가장 최소로 배를 움직이려면 최대한 무거운 사람과 가벼운 사람을 보내도록 해야 한다" 였다.
-- 다른 풀이
주어진 배열의 크기가 매우 큰 경우, 부분 배열의 합을 구해야 하는 문제에서
투 포인터 알고리즘을 사용하면 더 효율적이라고 한다.
투 포인터 알고리즘은 완전 탐색에서 경우의 수를 효율적으로 탐색할 수 있게 해준다.
function solution(people, limit) {
let cnt = 0;
people.sort((a, b) => a - b);
let start = 0; // 시작 포인터
let end = people.length - 1; // 끝 포인터
// 시작 포인터와 끝 포인터가 유효할 때까지 loop
while (start < end) {
if (people[start] + people[end] <= limit) {
start++;
}
end--;
cnt++;
}
return cnt + (end - start + 1);
}
이번 문제의 경우에는 성능 면에서 큰 차이가 나지 않았지만,
shift() 는 시간복잡도가 O(n), 즉 배열의 크기만큼의 시간이 걸린다.
people 원소 범위가 이보다 더 커지면 시간 초과가 날 수 있음을 유의해야 겠다.
-- 참고 링크
Ready-For-Tech-Interview/Algorithm/투포인터 알고리즘.md at master · WooVictory/Ready-For-Tech-Interview
💻 신입 개발자로서 지식을 쌓기 위해 공부하는 공간 👨💻. Contribute to WooVictory/Ready-For-Tech-Interview development by creating an account on GitHub.
github.com
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / JavaScript] 숫자의 표현 (0) | 2024.04.14 |
---|---|
[프로그래머스/JavaScript] 최빈값 구하기 (0) | 2023.12.25 |
[프로그래머스/JavaScript] 분수의 덧셈 (1) | 2023.12.25 |