DEV

LeetCode #1920쉬움

1920. 순열로부터 배열 구성하기

1920. Build Array From Permutation

Array
해설 읽기 3
javascript

문제 설명

문제 설명: 길이가 n인 0-인덱스 순열 배열 nums가 주어졌을 때, 동일한 길이의 배열 ans를 생성하여 ans[i] = nums[nums[i]]가 되도록 하고 이를 반환하세요. 0-인덱스 순열 배열 nums는 0부터 nums.length - 1까지의 서로 다른 정수로 구성됩니다.

예제

예제 1

입력: nums = [0,2,1,5,3,4]
출력: [0,1,2,4,5,3]

예제 2

입력: nums = [5,0,1,2,3,4]
출력: [4,5,0,1,2,3]
설명: 배열 ans는 다음과 같이 구성됩니다:

예제 3

입력: nums = [0,2,1,5,3,4]
출력: [0,1,2,4,5,3]

예제 4

입력: nums = [5,0,1,2,3,4]
출력: [4,5,0,1,2,3]
설명: 배열 ans는 다음과 같이 구성됩니다:

⚠️제약 조건

  • 1 <= nums.length <= 1000

  • 0 <= nums[i] < nums.length

  • nums의 요소는 서로 다릅니다.

해결 방법

🎯접근 방식

이 문제는 주어진 배열을 기반으로 새로운 배열을 구성하는 문제로, 배열의 인덱스를 활용하여 값을 재배치합니다. map 함수를 사용하여 각 인덱스에서 nums[nums[i]] 값을 계산하여 새로운 배열을 생성합니다. 핵심 아이디어는 각 인덱스의 값을 다른 인덱스의 값으로 대체하는 방식으로, 이는 배열의 인덱스 접근을 두 번 사용하여 해결할 수 있습니다.

솔루션 코드

복잡도 분석

시간 복잡도:O(n)
공간 복잡도:O(n)

💡상세 설명

이 문제는 주어진 배열 nums를 기반으로 새로운 배열 ans를 생성하는 것입니다. 배열 nums는 0부터 nums.length - 1까지의 서로 다른 정수를 포함하는 순열입니다. ans 배열은 각 인덱스 i에 대해 ans[i] = nums[nums[i]]가 되도록 해야 합니다.

이제 주어진 해결 코드와 함께 문제를 단계별로 설명하겠습니다.

1. 알고리즘의 핵심 아이디어

알고리즘의 핵심은 각 인덱스 i에 대해 두 번의 인덱싱을 통해 nums 배열에서 값을 가져오는 것입니다. 즉, nums[i]가 가리키는 인덱스를 다시 nums 배열에서 참조하여 최종 값을 가져옵니다. 이 과정을 배열의 모든 요소에 대해 반복하여 새로운 배열 ans를 생성합니다.

2. 코드의 주요 로직 설명

var buildArray = function(nums) {
    return nums.map((num, index) => nums[nums[index]]);
};

위 코드는 JavaScript의 map 함수를 사용하여 nums 배열의 각 요소에 대해 새로운 값을 계산합니다. map 함수는 배열의 각 요소를 순회하며 주어진 콜백 함수에 따라 새로운 배열을 생성합니다.

3. 각 단계별 동작 과정

  • map 함수 사용: nums.map((num, index) => nums[nums[index]])nums 배열의 각 요소를 순회합니다.

    • num: 현재 요소의 값 (사실 이 문제에서는 사용되지 않습니다).
    • index: 현재 요소의 인덱스.
  • 이중 인덱싱: nums[nums[index]]는 현재 인덱스 index에서 nums 배열을 두 번 참조하여 값을 가져옵니다.

    • 첫 번째 참조: nums[index]는 현재 인덱스의 값을 가져옵니다. 이 값은 nums 배열의 또 다른 인덱스를 나타냅니다.
    • 두 번째 참조: nums[nums[index]]는 첫 번째 참조에서 얻은 인덱스를 사용하여 nums 배열에서 최종 값을 가져옵니다.
  • 새로운 배열 생성: map 함수는 각 인덱스에 대해 계산된 값을 모아 새로운 배열을 반환합니다.

4. 핵심 변수들의 역할

  • nums: 주어진 입력 배열로, 0부터 n-1까지의 숫자가 포함된 순열입니다.
  • index: nums 배열의 현재 요소의 인덱스를 나타냅니다.
  • ans: 최종적으로 반환되는 배열로, 각 인덱스 i에 대해 ans[i] = nums[nums[i]]가 됩니다.

5. 왜 이 방법이 효과적인지

이 방법은 매우 직관적이고 간단합니다. map 함수를 사용하여 불필요한 루프 변수를 사용하지 않고, 배열의 각 요소에 대해 직접적으로 새로운 값을 계산할 수 있습니다. 또한, 이중 인덱싱을 통해 문제의 요구 사항을 정확하게 충족시킵니다. nums 배열이 순열이기 때문에, 각 인덱스 접근은 유효하며, 중복된 값이 없으므로 안전하게 수행됩니다.

이러한 방식은 코드가 간결하고 이해하기 쉬우며, 시간 복잡도는 O(n)으로 매우 효율적입니다. 각 요소에 대해 상수 시간 내에 접근하고 계산하기 때문입니다.

관련 문제