1. Two Sum
1. Description
- Given an array of integers
numsand an integertarget, return the indicesiandjsuch thatnums[i] + nums[j] == targetandi != j. - You may assume that every input has exactly one pair of indices
iandjthat satisfy the condition. - Return the answer with the smaller index first.
2. Example
Example 1
Input: nums = [3,4,5,6], target = 7 Output: [0,1]
Example 2
Input: nums = [4,5,6], target = 10 Output: [0,2]
Example 3
Input: nums = [5,5], target = 10 Output: [0,1]
3. Solution
- 📌이번 문제는 친구(광성)이가 전에 말했던 투 포인터를 사용해서 쓸 생각을 했었다.
- 내가 이해한 투 포인터가 맞는지는 잘모르겠지만
- 배열의 처음과 뒷부분을 지정해서 뒷부분 인덱스를 하나씩 줄여서 비교해가는걸 생각했다.
- 이후 코드를 짰으나 Brute Force 방법으로 하게 되는거라 다른 방법을 찾아보았다.
- 스택을 이용해 첫번째 인덱스 값을 넣고 이후 위의 투 포인터방식과 비슷하게 값을 비교해서 넣는 방식으로 생각했지만 그저 시간복잡도가 더 큰 코드가 되었다.
- 내가 이해한 투 포인터가 맞는지는 잘모르겠지만
- 이후에 구글에 검색해서 여러 답지들을 확인하고
enumerate를 사용해서 딕셔너리로 푸는 방법을 알게 되었다. (거의 전부 딕셔너리로 hash table을 만들어 풀었다.)
- 첫번째 풀이
- runtime: 0ms
- 설명
- 빈 딕셔너리를 하나 만든다.
enumerate함수를 사용하여 배열의 인덱스와 값을 나눈다.target에서 값을 빼서 나오는value가 결국에는 배열에 있는 값이랑 같으면 인덱스를 출력하는 방법이다.value값이 딕셔너리num_dict에 있다면[num_dict[value],i]를 리턴- 아니면
num_dict[num] = i로 인덱스 값을 저장한다. - 이후
for문을 돌면서 값을 찾는다.
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
num_dict = {}
for i, num in enumerate(nums):
value = target - num
if value in num_dict:
return [num_dict[value], i]
num_dict[num] = i
return []- 📌
enumerate함수는 순서가 있는 자료형을 입력으로 받았을 때, 인덱스와 값을 포함하여 리턴 - 📌
dictionary의 키 값을 가져 올때 대괄호를 사용하여 값을 불러올 수 있다.
4. What I Learned
References