이번에도 숫자를 엄청 줄게!!
숫자 3개를 뽑아서 그 숫자들의 합이 내가 원하는 숫자랑 가장 가까워지는 값을 찾아줘!!
자세한 문제 설명과 릿코드 홈페이지 참고. 문제풀러가기
이번에도 숫자 세개를 뽑아서... 더해서 ... 원하는 숫자와 얼마나 가까운지 체크하면 된다!
다만 이번에도 3개 전부 완전탐색을 돌려버리게 된다면 타임아웃이 뜨지 않을까?
저번과 마찬가지로 투포인터 접근법으로 풀었다.
이전 문제를 풀었다면 별로 어렵지 않을 것이다!
저번과 마찬가지로 정렬 후 selected, left, right 숫자를 선정합니다.
이후 알고리즘은
가장 중요한 left 와 right 의 인덱스를 어떻게 변화시킬거냐.. 는 다음과 같습니다.
왜냐면 방금 구한 합보다 작아져야 원하는 숫자에 더 가까워지기 때문 !!
계싼은 컴퓨터에게 맡겨욥!!
var threeSumClosest = function (nums, target) {
let answer = 100000;
let minDist = 1000000;
nums.sort((a, b) => a - b);
let selected = 0;
while (selected < nums.length - 2) {
let left = selected + 1;
let right = nums.length - 1;
while (left < right) {
let sum = nums[selected] + nums[right] + nums[left];
if (minDist >= Math.abs(sum - target)) {
minDist = Math.abs(sum - target);
answer = sum;
}
if (target - sum < 0) {
right--;
} else {
left++;
}
}
selected++;
}
return answer;
};
이전 문제를 풀었기 때문에 쉽게 풀 수 있었다.
이 알고리즘으로는 시간복잡도 O(n^2) 에 풀 수 있다.
혹시 O(nlgn) 방법으로도 가능할까 싶어서 생각하고 찾아봤는데.. 답은 나오지 않았다.
뭔가 있을거 같은데 ...