Leetcode Python - Two Sum
Leetcode #1 - Two Sum
리트코드의 1번 문제 ‘Two Sum’을 파이썬으로 풀어 보도록 하겠습니다. 이 문제는 int 리스트에서 2개의 합이 타켓 int 가 되게 하는 것입니다. https://leetcode.com/problems/two-sum/
첫 번째로 brute-force 방식으로 하나하나씩 구해보겠습니다. 그러기 위해서는 리스트에서 2개의 합을 구해야 하므로, 이중 for loop를 돌면서 두 개의 합이 타켓과 일치할 때 리턴해주면 됩니다.
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(0,len(nums)-1):
for _i in range(i+1, len(nums)):
if(nums[i] + nums[_i] == target):
return [i,_i]
시간 복잡도는 O(n²) : 2중 for loop를 이용, 공간 복잡도는 O(1) : i 와 _i만이 선언되었으니 상수
결과는 아래와 같습니다.
Runtime: 48 ms, Memory Usage: 14.4 MB
이 결과를 개선하기 위해 이렇게 해봅시다. 중복된 값이 안 나온다고 하였으므로, list를 dictionary로 바꾸어서 (key는 list의 값들로, value는 index로) for loop를 한 번으로 줄여 보겠습니다.
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dic = {}
i = 0
for v in nums:
dic[v] = i
i += 1
for _i in range(len(nums)):
if target - nums[_i] in dic and dic[target - nums[_i]] != _i:
return [dic[target-nums[_i]], _i]
Runtime: 64 ms Memory Usage: 14.6 MB
runtime이 이중 for loop보다 더 오래나오는군요..
discuss탭으로 가서 O(n)으로 구현한 것이 있어 봐보겠습니다.
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
d = {}
for i,n in enumerate(nums):
m = target - n
if m in d:
return [d[m],i]
else:
d[n] = i
먼저, enumerate를 이용해 index i와 value n을 선언하고, target에서 n을 뺀 나머지를 d에서 찾는 로직입니다. 확실히 이렇게 구현할 경우 O(n)으로 구현이 가능합니다.
시간복잡도 : O(n) 공간복잡도 : O(1)