문제 설명
문제 설명: 길이가 n인 0-인덱스 순열 배열 nums가 주어졌을 때, 동일한 길이의 배열 ans를 생성하여 ans[i] = nums[nums[i]]가 되도록 하고 이를 반환하세요. 0-인덱스 순열 배열 nums는 0부터 nums.length - 1까지의 서로 다른 정수로 구성됩니다.
예제
예제 1
예제 2
예제 3
예제 4
⚠️제약 조건
- •
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)으로 매우 효율적입니다. 각 요소에 대해 상수 시간 내에 접근하고 계산하기 때문입니다.