문제 링크
문제 설명
- 덧셈하여 타겟을 만들 수 있는 배열의 두 숫자 인덱스를 리턴
입력
nums = [2, 7, 11, 15], target = 9
출력
[0, 1]
설명
nums[0] + nums[1] = 2 + 7 = 9
풀이 전략
- 풀이 전략은 아래와 같이 다양하게 접근 할 수 있다.
- Brute-Force 계산
- in을 이용한 탐색
- 첫 번재 수를 뺀 결과 키 조회
- 조회 구조 개선
- 투 포인트 이용
- 5가지 중 가장 추천하는 풀이 전략은 4번 이며, 5번은 문제 풀이를 못할 수도 있다.
조회 구조 개선
- for 문 하나로 해결
- 전체를 모두 저장할 필요 없이 정답을 찾게 되면 함수를 빠져 나올 수 있다
- 코드가 한결 더 간결해 진다.
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
nums_map = {} # 1. 숫자와 인덱스를 저장할 딕셔너리 생성
for i, num in enumerate(nums): # 2. 배열을 순회하면서 조건을 확인
if target - num in nums_map: # 3. (target - num) 값이 이미 nums_map에 있는지 확인
return [nums_map[target - num], i] # 4. 있다면 그 인덱스와 현재 인덱스 반환
nums_map[num] = i # 5. 없다면 현재 숫자와 인덱스를 딕셔너리에 추가
코드 분석
- 딕셔너리 생성
:nums_map
은 각 숫자와 그 숫자의 인덱스를 저장하는 딕셔너리입니다.
이를 통해 상수를 이용해 값을 찾을 수 있는 빠른 조회가 가능합니다.nums_map = {}
- 반복문
:nums
리스트의 각 요소와 해당 인덱스를 가져와 반복합니다.for i, num in enumerate(nums):
- 차이 값 검사
:반복문에서 현재 값num
의 보완 값(target - num
)이 딕셔너리nums_map
에 있는지 검사합니다.
이 보완 값이 존재한다면, 그 값과 현재 값의 합이target
이 될 수 있다는 의미입니다.if target - num in nums_map:
- 인덱스 반환
:보완 값이 딕셔너리에 있다면, 해당 보완 값의 인덱스(nums_map[target - num]
)와 현재 인덱스i
를 리스트로 반환합니다. 이 두 인덱스는 조건을 만족하는 숫자들의 인덱스가 됩니다.return [nums_map[target - num], i]
- 딕셔너리에 추가
:보완 값이 딕셔너리에 없다면 현재 숫자와 인덱스를nums_map
에 추가합니다. 이를 통해 다음 반복에서 현재 값을 찾는 데 활용될 수 있습니다.nums_map[num] = i
예시
nums = [2, 7, 11, 15]
와 target = 9
일 때:
- 첫 번째 반복 (
i = 0
,num = 2
):target - num = 9 - 2 = 7
이nums_map
에 없으므로nums_map
에{2: 0}
추가
- 두 번째 반복 (
i = 1
,num = 7
):target - num = 9 - 7 = 2
가nums_map
에 존재 ({2: 0}
), 따라서[0, 1]
반환
따라서 반환값은 [0, 1]
입니다.
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
nums_map = {}
for i, num in enumerate(nums):
# print('[for] i= '+str(i)+", num= "+str(num))
if target - num in nums_map:
# print('return ['+str(nums_map[target - num])+', '+str(i)+']')
return [nums_map[target - num], i]
# print('nums_map['+str(num)+'] = '+ str(i))
nums_map[num] = i
# print('----------------------')
# 출력
[for] i= 0, num= 2
nums_map[2] = 0
----------------------
[for] i= 1, num= 7
return [0, 1]
- nums = [2,7,11,15]이며, target = 9 이다.
- 첫번재 for문에서는 조건에 안맞아 if를 수행하지 않고, nums_map에 i와 num 값을 거꾸로 저장한다.
- 두번째 for문에서는 9 - 7 = 2 이기 때문에 첫번째 for문에서 nums_map에 저장된 nums_map[2]의 값을 사용한다.
- 그래서 정답인 [0, 1]이 출력된다.