Programming/leetcode
1. Two Sum
홍열
2021. 1. 28. 10:10
728x90
배열과 특정 값이 주어지고, 배열 안에서 두 수를 합쳐 특정 값이 나올 수 있는지 찾는 문제
* 반드시 유의미한 정답은 한개는 있다
예를 들어서, [1,3,5,7,9]와 6이 주어지면 [1,5]로 6을 만들수 있고, 이것들의 위치를 넘겨주면 되는 문제
for 두 번 돌려서 확인 가능하다.
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(0, len(nums)):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
근데 for 두번이면 시간 복잡도가 n^2이므로 이것보다 빠르게 하는 방법을 찾아보면...
1) in을 이용한다.
-> for 한개에서 첫번째 값을 지정해놓고, 나머지값을 in으로 찾기
-> list.index(target, start, end)를 이용하면 배열 안에서 값의 위치를 찾을 수 있다. 찾을 범위도 지정 가능하다.
-> index(target)을 해버리면 [3,3], 6에서 결과값이 [0, 0]이 되버린다. 따라서 start위치를 i+1로 지정해줘야한다.
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
sub = target - nums[i]
if sub in nums[i+1:]:
return [i, nums.index(sub, i+1)]
2) dict를 이용한다.
dic에 값들을 저장한 후에 in을 이용하는 방법
def twoSum(self, nums: List[int], target: int) -> List[int]:
dic = {}
for i, value in enumerate(nums):
dic[value] = i
for i, value in enumerate(nums):
if target - value in dic and i != dic[target-value]:
return [i, dic[target-value]]