카테고리 없음
[LeetCode] 1. Two Sum
_OB1N
2021. 8. 3. 15:12
문제 출처: https://leetcode.com/problems/two-sum/
Two Sum - 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
문제
정수 배열 nums와 정수 target이 주어지면, 두 숫자의 합이 target을 만드는 인덱스를 반환하라.
각 입력에는 정확히 한 개의 답이 존재하고, 같은 원소를 두 번 사용하지 않아야 한다.
순서와 관계없이 답을 반환하라.
예제
Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].
Input: nums = [3,3], target = 6
Output: [0,1]
풀이
리트코드의 첫 문제인 만큼 난이도가 높은 문제는 아니다. 비교적 쉬운 문제로 분류되는 만큼 다양한 방법으로 문제 풀이가 가능하다.
- 이중 반복문
- 정렬 후, 이진 탐색
- 정렬 후, 투 포인터
- 맵 자료구조
여기서는 투 포인터 방식을 사용하여 문제에 접근하였다.
- 최초 배열 nums를 인덱스와 엮는다. ( 최종 반환해야 하는 값이 인덱스이기 때문 )
- 인덱스와 값이 엮인 배열을 값 순으로 정렬한다.
- 투 포인터 방식을 이용하여 target을 만드는 쌍을 찾는다. ( lo 포인터: 배열의 첫 요소, hi 포인터: 배열의 마지막 요소 )
var twoSum = function(nums, target) {
const list = nums.map((val, idx) => [val, idx]);
list.sort((a, b) => a[0] - b[0]);
let lo = 0, hi = nums.length-1;
while (list[lo][0] + list[hi][0] != target) {
if (list[lo][0] + list[hi][0] > target) {
hi -= 1;
} else {
lo += 1;
}
}
return [list[lo][1], list[hi][1]];
}
이 방식의 시간복잡도는 정렬에 소요되는 시간복잡도에 의존적일 것이기 때문에 O(nlogn)이 될 것이다.
Github: 1.js
GitHub - opwe37/Algorithm-Study
Contribute to opwe37/Algorithm-Study development by creating an account on GitHub.
github.com