일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 개발공부
- 코딩부트캠프
- [파이썬 실습] 심화 문제
- 프론트개발
- 자바스크립트 reduce()
- 자바스크립트 날씨 웹 만들기
- 프로그래머스
- 리트코드
- 자바스크립트 날씨
- 개발일기
- [AI 5기] 연습 문제집
- 엘리스 ai 트랙
- RN 프로젝트
- 자바스크립트 split()
- leetcode
- JavaScript
- HTML
- [파이썬 실습] 중급 문제
- [파이썬 실습] 기초 문제
- 엘리스 AI 트랙 5기
- 자바스크립트 sort()
- 간단한 날씨 웹 만들기
- 자바스크립트
- 프론트개발공부
- 엘리스
- 코드스테이츠
- reactnativecli
- 부트캠프
- 날씨 웹 만들기
- 삼항연산자
- Today
- Total
개발조각
[리트코드] 16. 3Sum Closest 본문
안녕하세요. 개발조각입니다.😊
이번 문제는 15번 문제의 응용 버전인 것 같아요.
15번을 이해하셨으면 쉽게 풀었을 것 같고,
16번 답안이 15번 코드와 90% 정도 똑같은 것 같아요.
https://leetcode.com/problems/3sum-closest/
3Sum Closest - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
해결방안
var threeSumClosest = function(nums, target) {
nums.sort((a,b)=>a-b);
let answer = nums[0] + nums[1] + nums[nums.length-1];
for(let i=0; i<nums.length-2; i++){
if(nums[i] === nums[i-1]) continue;
let [point, start, end] = [i, i+1, nums.length-1];
while(start < end){
let sum = nums[point] + nums[start] + nums[end];
if(sum < target) start++;
else if(sum > target) end--;
else return target;
let [answerAbs, sumAbs] = [Math.abs(answer-target), Math.abs(sum-target)];
if(answerAbs < sumAbs) continue;
else answer = sum;
}
}
return answer;
};
nums.sort((a,b)=>a-b);
먼저 정렬을 해줍니다.
정렬을 해주는 이유는 3개의 수의 합이 sum이라 하면
sum이 targt보다 작거나, 크거나, 같을 경우에 따라 제어해줄 거라 무조건 정렬을 해줘야 됩니다.
let answer = nums[0] + nums[1] + nums[nums.length-1];
answer은 target에 가장 가까운 숫자를 구해줄 변수입니다.
여기서는 let answer = 0;이라고 안 쓰고 실제로 3개의 수를 더했을 때의 합을 넣어 주었습니다.
target이 0일 경우도 있고 등등의 문제가 있어서 실제로 3개의 수를 더했을 때의 합을 넣어 주었습니다.
for(let i=0; i<nums.length-2; i++){
if(nums[i] === nums[i-1]) continue;
let [point, start, end] = [i, i+1, nums.length-1];
while(start < end){
let sum = nums[point] + nums[start] + nums[end];
if(sum < target) start++;
else if(sum > target) end--;
else return target;
let [answerAbs, sumAbs] = [Math.abs(answer-target), Math.abs(sum-target)];
if(answerAbs < sumAbs) continue;
else answer = sum;
}
}
15번 문제와 똑같이
for문으로 point를 이동시킬 거고
while문으로 start, end를 이동시켜줍니다.
규칙은 아래와 같이 진행이 됩니다.
- sum < target → start++
- sum > target → end++
- sum === target → 다른 값을 구할 필요가 없기 때문에 return을 해준다.
15번 문제와 유사하지만 다른 점
sum === target일 경우
else return target;
만약 이전에 만든 sum값(즉 answer) 이 현재 sum값보다 target에 가까운 경우
다음으로 넘겨줍니다.
아닐 경우 answer을 현재 sum값으로 바꾸어 주면 됩니다.
let [answerAbs, sumAbs] = [Math.abs(answer-target), Math.abs(sum-target)];
if(answerAbs < sumAbs) continue;
else answer = sum;
'알고리즘🅰 > 리트코드' 카테고리의 다른 글
[리트코드] 18. 4Sum (0) | 2022.09.21 |
---|---|
[리트코드] 17. Letter Combinations of a Phone Number (0) | 2022.09.20 |
[리트코드] 15. 3Sum (0) | 2022.09.18 |
[리트코드] 14. Longest Common Prefix (0) | 2022.09.15 |
[리트코드] 13. Roman to Integer (0) | 2022.09.13 |