
문제 링크 https://leetcode.com/problems/two-sum/
Given an array of integers
numsand an integertarget, return indices of the two numbers such that they add up totarget.
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.
Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Output: Because nums[0] + nums[1] == 9, we return [0, 1].
Input: nums = [3,2,4], target = 6
Output: [1,2]
Input: nums = [3,3], target = 6
Output: [0,1]
nums라는 integer 배열과 target이라는 integer 값을 인자로 받고 nums의 i번째 값과 j번째 값의 합이 target 값과 같을시 [i,j] Return한다.정렬을 사용.
시간 복잡도 : O(nlogn)
class Solution(object):
def twoSum(self, nums, target):
answer = []
# 인자로 받은 숫자들을 오름차순으로 정렬한뒤,
sorted_nums = sorted(nums)
# 가장 왼쪽 / 가장 오른쪽의 포지션을 설정해준다
left, right = 0, len(sorted_nums) - 1
# left 와 right 포지션이 서로 교차될 때 까지 반복
while left < right:
if sorted_nums[left] + sorted_nums[right] == target:
# left가 가리키는 값과 right가 가리키는 값을 더해 주어지는 target과 값이 같다면, 해당 element를 정답 리스트에 추가하며 반복문 탈출
answer.append(sorted_nums[left])
answer.append(sorted_nums[right])
break
elif sorted_nums[left] + sorted_nums[right] > target:
# left가 가리키는 값과 right가 가리키는 값이 target 보다 크다면, right 포지션을 왼쪽(<)으로 이동
right -= 1
elif sorted_nums[left] + sorted_nums[right] < target:
# left가 가리키는 값과 right가 가리키는 값이 target 보다 작다면, left 포지션을 오른쪽(>)으로 이동
left += 1
# return 해야하는 값은 더해서 target이 되는 2개의 Element의 값이 아니라,
# 원래 인자로 주어졌던 nums 리스트에서 2개의 값이 어디에 위치하고 있는건지 즉, Position의 리스트를 return 해야하므로,
# 리스트 컴프리헨션을 통해 정답 element 2개의 index를 리스트로 반환
return [i for i, num in enumerate(nums) if num in answer]
Hash Table 을 사용.
시간 복잡도 : O(N)
class Solution(object):
def twoSum(self, nums, target):
# 딕셔너리 자료형 생성
dictionary = {}
for i, num in enumerate(nums):
if num not in dictionary:
# 해당 num 값이 딕셔너리에 Key로 없다면,
# nums를 순회하며, 각 Element 에서 더해야 할 값(gap)을 구한다.
gap = target - num
# 딕셔너리에 gap 값을 Key로, 현재 position을 value로 등록
dictionary[gap] = i
else:
# 해당 num 값이 이미 딕셔너리에 Key로 있다면 (== 어떤 element의 gap 값과 일치하는 num일 경우) ,
# 현재 반복문의 Position & 딕셔너리에서 Key 값으로 받아온 Position이 정답이므로 해당 값들을 리턴
return [i, dictionary[num]]