DEV

LeetCode #1쉬움

1. 두 수의 합

1. Two Sum

Algorithm
해설 읽기 3
typescript

문제 설명

정수 배열 nums와 정수 target이 주어졌을 때, 두 수를 더하여 target이 되는 두 숫자의 인덱스를 반환하세요. 각 입력은 정확히 하나의 해답이 존재하며, 동일한 요소를 두 번 사용할 수 없습니다. 답은 어떤 순서로든 반환할 수 있습니다. **

예제

예제 1

입력: nums = [2,7,11,15], target = 9
출력: [0,1]
설명: nums[0] + nums[1] == 9이기 때문에 [0, 1]을 반환합니다.

예제 2

입력: nums = [3,2,4], target = 6
출력: [1,2]

예제 3

입력: nums = [3,3], target = 6
출력: [0,1]

⚠️제약 조건

  • 제약조건:

  • 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이 되는 수를 미리 저장해 두고, 다음에 그 수가 나타나면 두 수의 인덱스를 반환하는 방식입니다.

이제 코드를 단계별로 설명하겠습니다.

코드의 주요 로직 설명

  1. 변수 초기화:

    const savedNum = new Map()
    
    • savedNum이라는 Map 객체를 생성합니다. 이 객체는 특정 숫자가 필요한 보완 수와 그 숫자의 인덱스를 저장하는 역할을 합니다.
  2. 반복문으로 배열 탐색:

    for (let i = 0; i < nums.length; i++) {
      const num = nums[i]
    
    • nums 배열을 처음부터 끝까지 탐색합니다. i는 현재 인덱스를 나타내고, num은 현재 인덱스의 값을 나타냅니다.
  3. 보완 수 확인:

    if (savedNum.has(num)) {
      return [savedNum.get(num), i]
    }
    
    • 현재 숫자 numsavedNum에 저장되어 있는지 확인합니다. 만약 저장되어 있다면, 이는 이전에 어떤 숫자와 더했을 때 target이 되는 보완 수라는 의미입니다. 따라서 savedNum에서 해당 보완 수의 인덱스를 가져와 현재 인덱스 i와 함께 반환합니다.
  4. 보완 수 저장:

    savedNum.set(target - num, i)
    
    • 만약 numsavedNum에 없다면, target에서 현재 숫자를 뺀 값을 보완 수로 계산하고, 이를 savedNum에 현재 인덱스와 함께 저장합니다. 이는 이후에 이 보완 수가 나타날 경우를 대비하기 위함입니다.

각 단계별 동작 과정

  • 예시 1: nums = [2,7,11,15], target = 9

    1. i = 0, num = 2: savedNum9 - 2 = 7을 보완 수로 저장.
    2. i = 1, num = 7: savedNum7이 존재하므로, [0, 1] 반환.
  • 예시 2: nums = [3,2,4], target = 6

    1. i = 0, num = 3: savedNum6 - 3 = 3을 보완 수로 저장.
    2. i = 1, num = 2: savedNum6 - 2 = 4을 보완 수로 저장.
    3. i = 2, num = 4: savedNum4가 존재하므로, [1, 2] 반환.

핵심 변수들의 역할

  • savedNum: 각 숫자에 대해 필요한 보완 수와 그 숫자의 인덱스를 저장하는 Map입니다. 이를 통해 배열을 한 번만 순회하면서도 두 수의 합이 target이 되는 경우를 효율적으로 찾을 수 있습니다.

왜 이 방법이 효과적인지

이 방법은 배열을 한 번만 순회하면서 해결할 수 있기 때문에 시간 복잡도가 O(n)으로 매우 효율적입니다. Map을 사용하여 평균적으로 O(1) 시간에 보완 수를 확인하고 저장할 수 있습니다. 따라서 이 방법은 큰 배열에서도 빠르게 작동합니다.

이와 같은 접근 방식은 문제의 조건(정확히 하나의 해답이 존재함)을 잘 활용하여 불필요한 계산을 줄이고, 효율적으로 문제를 해결합니다.

관련 문제