Given an array of integers nums
and an integer target
, return indices of the two numbers such that they add up to target
.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
You can return the answer in any order.
nums.length
<= nums[i]
<= target
<= Example 1:
Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].
Example 2:
Input: nums = [3,2,4], target = 6
Output: [1,2]
Example 3:
Input: nums = [3,3], target = 6
Output: [0,1]
input
의 갯수가 시간복잡도로 풀기에는 개라서 이 방법은 최선의 선택이 아닌것 같았다. target
을 비교한 뒤target
보다 작으면 방금 구한 결과보다 새로운 결과가 커지도록 옮긴다.target
보다 크다면 새 결과가 작아지는 방향으로 옮긴다.sortedNums
라는 새로운 리스트를 만든다.target
을 비교한다. 이 결과를 sum
이라고 한다.target
과 sum
을 비교하여 같다면 인덱스들을 리턴한다.sum
< target
이면 시작 인덱스를 한 칸 뒤로 옮긴다. sum
> target
이면 끝 인덱스를 한 칸 앞으로 옮긴다.nums
배열의 인덱스와 다르다. 정렬된 새로운 리스트의 인덱스이기 때문이다.target
과 sum
이 일치하는 두 값을 기준으로 원래 nums
배열에서 해당 값들이 어떤 인덱스였는지 찾아서 리턴한다.nums.index()
는 처음 나타난 인덱스만 리턴하므로, 뒤에서부터 찾는 메서드인 rindex(nums, value)
를 따로 정의해 사용했다.class Solution:
def rindex(self, list, val):
return len(list) - 1 - list[::-1].index(val)
def twoSum(self, nums: List[int], target: int) -> List[int]:
sortedNums = sorted(nums);
left = 0
right = len(nums) - 1
while left < right:
sum = sortedNums[left] + sortedNums[right]
if sum == target:
return [nums.index(sortedNums[left]), self.rindex(nums, sortedNums[right])]
if sum < target:
left += 1
elif sum > target:
right -= 1
시간복잡도를 활용하여 접근 방법이나 적용한 알고리즘에 대한 힌트를 얻는 방법을 배웠다.
배열이 주어지는 문제라면, 해당 배열의 정렬 여부가 어떤 알고리즘을 적용시킬지에 대한 힌트가 될 수 있다는 것을 배웠다.
정렬을 하는 것 자체도 실행시간에 포함되므로 정렬이 실행시간에 얼마나 영향을 미치는지 또한 염두에 두고 풀어야겠다.
(이번 문제에서는 정렬이 , 반복문이 으로 정렬이 시간이 더 걸릴것으로 예상된다. 하지만 전체 시간복잡도가 nlogn이라 정답을 내는 데는 충분했던 것 같다.)
감사합니다. 이런 정보를 나눠주셔서 좋아요.