DEV

LeetCode #189보통

189. 회전 배열

189. Rotate Array

Array
해설 읽기 3
javascript

문제 설명

정수 배열 nums가 주어졌을 때, 배열을 오른쪽으로 k번 회전하세요. 여기서 k는 음이 아닌 정수입니다.

예제

예제 1

입력: nums = [1,2,3,4,5,6,7], k = 3
출력: [5,6,7,1,2,3,4]

예제 2

입력: nums = [-1,-100,3,99], k = 2
출력: [3,99,-1,-100]

⚠️제약 조건

  • 1 ≤ nums.length ≤ 105

  • -231 ≤ nums[i] ≤ 231 - 1

  • 0 ≤ k ≤ 105

해결 방법

🎯접근 방식

이 접근 방식은 배열을 회전시키기 위해 추가 배열을 사용하는 방법입니다. 먼저, 회전해야 할 위치를 계산하기 위해 k를 배열의 길이 n으로 나눈 나머지를 사용합니다. 그런 다음, 새로운 배열 rotated에 각 요소를 적절한 위치로 이동시키고, 마지막으로 원래 배열 nums에 복사하여 결과를 얻습니다. 핵심 아이디어는 인덱스 계산을 통해 새로운 배열에 요소를 재배치하는 것입니다.

솔루션 코드

복잡도 분석

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

💡상세 설명

이 문제는 주어진 정수 배열 nums를 오른쪽으로 k만큼 회전시키는 것입니다. 이를 해결하기 위해 주어진 코드는 배열을 새롭게 구성하여 회전된 결과를 얻습니다. 이제 코드의 작동 방식을 단계별로 설명하겠습니다.

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

이 문제의 핵심은 배열을 오른쪽으로 k번 회전시키는 것입니다. 이를 위해 배열의 각 요소를 새로운 위치로 이동시키는 방법을 사용합니다. 새로운 위치는 현재 인덱스에 k를 더한 후 배열의 길이 n으로 나눈 나머지로 결정됩니다. 이 방법은 배열의 끝을 넘어가는 인덱스를 처리하는 데 유용합니다.

2. 코드의 주요 로직 설명

코드는 두 가지 주요 단계로 나뉩니다:

  • 첫 번째 단계에서는 회전된 결과를 저장할 새로운 배열 rotated를 만듭니다.
  • 두 번째 단계에서는 이 rotated 배열의 값을 원래 배열 nums에 복사하여 결과를 반영합니다.

3. 각 단계별 동작 과정

  1. 배열 길이와 회전 수 조정:

    const n = nums.length;
    k = k % n;
    
    • n은 배열의 길이를 저장합니다.
    • k = k % nk가 배열의 길이보다 클 경우를 처리합니다. 예를 들어, 배열의 길이가 7일 때 10번 회전하는 것은 3번 회전하는 것과 동일합니다.
  2. 새로운 배열에 회전된 값 저장:

    const rotated = new Array(n).fill(0);
    for (let i = 0; i < n; i++) {
        rotated[(i + k) % n] = nums[i];
    }
    
    • rotated는 회전된 결과를 임시로 저장할 배열입니다.
    • for 루프를 통해 nums의 각 요소를 새로운 위치로 이동시킵니다. (i + k) % n은 각 요소의 새로운 인덱스를 계산합니다.
  3. 원래 배열에 결과 반영:

    for (let i = 0; i < n; i++) {
        nums[i] = rotated[i];
    }
    
    • 두 번째 for 루프는 rotated 배열의 값을 다시 nums에 복사하여 최종 결과를 반영합니다.

4. 핵심 변수들의 역할

  • n: 배열의 길이로, 회전 계산 및 배열 순회를 위해 사용됩니다.
  • k: 회전할 횟수로, 배열의 길이로 나눈 나머지를 사용하여 최적화합니다.
  • rotated: 회전된 배열을 임시로 저장하는 배열입니다.

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

이 방법은 배열을 직접적으로 수정하지 않고 임시 배열을 사용하여 회전된 결과를 계산합니다. 이는 코드의 가독성을 높이고, 인덱스 계산을 명확하게 합니다. 또한, k를 배열의 길이로 나눈 나머지로 처리함으로써 불필요한 회전을 줄일 수 있어 효율적입니다.

이 코드의 시간 복잡도는 O(n)이며, 공간 복잡도는 O(n)입니다. 이는 배열을 한 번 순회하고, 동일한 크기의 임시 배열을 사용하기 때문입니다. 이 방법은 명확하고 직관적이며, 배열 회전 문제를 효과적으로 해결합니다.

관련 문제