난이도: Easy
문제 링크: https://leetcode.com/problems/two-sum/
조합 생성 시 자주 이용되는 itertools의 combinations를 이용했다.
test case는 무난하게 통과했지만, 시간복잡도가 높아 input길이가 길어지면 LeetCode에서 'time limit exceeded'가 뜨면서 submit이 진행되지 않았다.
from itertools import combinations
class Solution:
def twoSum(self, nums, target: int):
combs = list(combinations(nums, 2))
# #make a list of every possible answer
answers = [sum(a) for a in combs]
# make a hash table for every possible solution
answer_dict = {}
i = 0
for answer in answers:
answer_dict[answer] = combs[i]
i += 1
answer_comb = answer_dict[target]
a = nums.index(answer_comb[0])
nums.remove(answer_comb[0])
b = nums.index(answer_comb[1]) + 1 #compensates for the removed number
return [a,b]
-> 이때부터 머리를 싸매기 시작했다..
아마 O(n제곱) 미만으로 풀어야 하는 문제 같았다.
itertools.combinations() 메소드의 경우 시간복잡도가 O(n! / (n-r)! / r!) 인데, n이 커질수록 시간복잡도가 급격하게 증가하기 때문에, 2 <= nums.length <= 10**4 인 문제의 조건 상 활용하기 어려웠다. (nums.length가 인풋 길이)
그렇다면... 어떻게 target이 두 숫자의 sum과 일치하는지 알 수 있을까?
*아래 내용은 LeetCode의 공식 풀이를 참고했다.
class Solution:
def twoSum(self, nums, target: int):
hashmap = {num:nums.index(num) for num in nums}
for i in range(len(nums)):
complement = target-nums[i]
if complement in hashmap and i != hashmap[complement]:
return [i, hashmap[complement]]