[Grind75] Two Sum
Two Sum 핵심 정리
[Grind75] Two Sum
- Level: Easy
- Pattern: Hash Map
- Language: Python3
문제 요약
정수 배열에서 합이 target 이 되는 두 수의 인덱스를 찾는 문제.
같은 원소를 두 번 사용할 수 없고, 정답은 하나만 존재한다.
1. Brute Force 풀이
아이디어
모든 숫자 쌍을 하나씩 확인해서 합이 target 인지 검사한다.
코드
1
2
3
4
5
6
class Solution:
def twoSum(self, nums: list[int], target: int) -> list[int]:
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
시간복잡도
O(n^2)
특징
- 가장 직관적이다.
- 구현은 쉽지만 비효율적이다.
2. Hash Map 풀이
아이디어
현재 값 n 을 볼 때, target - n 값이 이전에 나왔는지 확인한다.
즉, 현재 값의 짝(complement)이 과거에 있었는지 찾는 방식이다.
코드
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def twoSum(self, nums: list[int], target: int) -> list[int]:
index_map = {}
for i, value in enumerate(nums):
complement = target - value
if complement in index_map:
return [index_map[complement], i]
index_map[value] = i
시간복잡도
O(n)
특징
- 한 번의 순회로 해결 가능하다.
- 코딩테스트에서 자주 나오는 정석 풀이이다.
이 문제의 암기 포인트
complement = target - value- 현재 값의 짝이 이전에 있었는지 확인한다.
- 먼저 찾고, 나중에 저장한다.
index_map은 과거 값 저장용이다.value -> index형태로 저장한다.
언제 Hash Map을 떠올릴까?
아래 같은 키워드가 보이면 hash map 패턴을 먼저 의심한다.
- 어떤 값이 이미 나왔는지 빠르게 확인해야 할 때
- 중복 검사가 필요할 때
- 값의 존재 여부를 바로 알아야 할 때
- 두 값의 pair / target / complement 관계를 찾아야 할 때
- 빈도 수 / 매칭 / 인덱스 저장이 필요한 문제일 때
한 줄 요약
Two Sum은 모든 쌍을 비교하는 brute force 문제를,
Hash Map으로 O(n)까지 줄이는 대표 문제다.
Always remember
Hash Mapvalue -> indexcomplement = target - valueone-pass- find first, then save
This post is licensed under CC BY 4.0 by the author.