문제 설명
정수 배열 nums와 정수 target이 주어졌을 때, 두 수를 더하여 target이 되는 두 숫자의 인덱스를 반환하세요. 각 입력은 정확히 하나의 해답이 존재하며, 동일한 요소를 두 번 사용할 수 없습니다. 답은 어떤 순서로든 반환할 수 있습니다.
**
예제
예제 1
예제 2
예제 3
⚠️제약 조건
- •
제약조건:
- •
2 <= nums.length <= 10^4
- •
-10^9 <= nums[i] <= 10^9
- •
-10^9 <= target <= 10^9
- •
유효한 답은 하나만 존재합니다.
해결 방법
🎯접근 방식
이 문제는 해시맵(Map)을 사용하여 해결할 수 있습니다. 각 숫자 num에 대해, target - num이 이전에 저장된 숫자인지 확인하고, 그렇다면 두 숫자의 인덱스를 반환합니다. 핵심 아이디어는 현재 숫자와 더해 target이 되는 숫자를 해시맵을 통해 빠르게 찾는 것입니다.
솔루션 코드
복잡도 분석
O(n)O(n)💡상세 설명
이 문제는 주어진 정수 배열 nums와 목표 정수 target이 있을 때, 두 수를 더해서 target이 되는 두 수의 인덱스를 찾는 문제입니다. 각 입력은 정확히 하나의 해답을 가지며, 같은 요소를 두 번 사용할 수 없습니다.
이 문제를 해결하기 위한 코드의 핵심 아이디어는 "보완 수"라는 개념을 활용하는 것입니다. 즉, 현재 숫자와 더해서 target이 되는 수를 미리 저장해 두고, 다음에 그 수가 나타나면 두 수의 인덱스를 반환하는 방식입니다.
이제 코드를 단계별로 설명하겠습니다.
코드의 주요 로직 설명
-
변수 초기화:
const savedNum = new Map()savedNum이라는Map객체를 생성합니다. 이 객체는 특정 숫자가 필요한 보완 수와 그 숫자의 인덱스를 저장하는 역할을 합니다.
-
반복문으로 배열 탐색:
for (let i = 0; i < nums.length; i++) { const num = nums[i]nums배열을 처음부터 끝까지 탐색합니다.i는 현재 인덱스를 나타내고,num은 현재 인덱스의 값을 나타냅니다.
-
보완 수 확인:
if (savedNum.has(num)) { return [savedNum.get(num), i] }- 현재 숫자
num이savedNum에 저장되어 있는지 확인합니다. 만약 저장되어 있다면, 이는 이전에 어떤 숫자와 더했을 때target이 되는 보완 수라는 의미입니다. 따라서savedNum에서 해당 보완 수의 인덱스를 가져와 현재 인덱스i와 함께 반환합니다.
- 현재 숫자
-
보완 수 저장:
savedNum.set(target - num, i)- 만약
num이savedNum에 없다면,target에서 현재 숫자를 뺀 값을 보완 수로 계산하고, 이를savedNum에 현재 인덱스와 함께 저장합니다. 이는 이후에 이 보완 수가 나타날 경우를 대비하기 위함입니다.
- 만약
각 단계별 동작 과정
-
예시 1:
nums = [2,7,11,15],target = 9i = 0,num = 2:savedNum에9 - 2 = 7을 보완 수로 저장.i = 1,num = 7:savedNum에7이 존재하므로,[0, 1]반환.
-
예시 2:
nums = [3,2,4],target = 6i = 0,num = 3:savedNum에6 - 3 = 3을 보완 수로 저장.i = 1,num = 2:savedNum에6 - 2 = 4을 보완 수로 저장.i = 2,num = 4:savedNum에4가 존재하므로,[1, 2]반환.
핵심 변수들의 역할
savedNum: 각 숫자에 대해 필요한 보완 수와 그 숫자의 인덱스를 저장하는Map입니다. 이를 통해 배열을 한 번만 순회하면서도 두 수의 합이target이 되는 경우를 효율적으로 찾을 수 있습니다.
왜 이 방법이 효과적인지
이 방법은 배열을 한 번만 순회하면서 해결할 수 있기 때문에 시간 복잡도가 O(n)으로 매우 효율적입니다. Map을 사용하여 평균적으로 O(1) 시간에 보완 수를 확인하고 저장할 수 있습니다. 따라서 이 방법은 큰 배열에서도 빠르게 작동합니다.
이와 같은 접근 방식은 문제의 조건(정확히 하나의 해답이 존재함)을 잘 활용하여 불필요한 계산을 줄이고, 효율적으로 문제를 해결합니다.