문제 설명
정수 배열 nums가 주어졌을 때, 배열을 오른쪽으로 k번 회전하세요. 여기서 k는 음이 아닌 정수입니다.
예제
예제 1
예제 2
⚠️제약 조건
- •
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. 각 단계별 동작 과정
-
배열 길이와 회전 수 조정:
const n = nums.length; k = k % n;n은 배열의 길이를 저장합니다.k = k % n은k가 배열의 길이보다 클 경우를 처리합니다. 예를 들어, 배열의 길이가 7일 때 10번 회전하는 것은 3번 회전하는 것과 동일합니다.
-
새로운 배열에 회전된 값 저장:
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은 각 요소의 새로운 인덱스를 계산합니다.
-
원래 배열에 결과 반영:
for (let i = 0; i < n; i++) { nums[i] = rotated[i]; }- 두 번째
for루프는rotated배열의 값을 다시nums에 복사하여 최종 결과를 반영합니다.
- 두 번째
4. 핵심 변수들의 역할
n: 배열의 길이로, 회전 계산 및 배열 순회를 위해 사용됩니다.k: 회전할 횟수로, 배열의 길이로 나눈 나머지를 사용하여 최적화합니다.rotated: 회전된 배열을 임시로 저장하는 배열입니다.
5. 왜 이 방법이 효과적인지
이 방법은 배열을 직접적으로 수정하지 않고 임시 배열을 사용하여 회전된 결과를 계산합니다. 이는 코드의 가독성을 높이고, 인덱스 계산을 명확하게 합니다. 또한, k를 배열의 길이로 나눈 나머지로 처리함으로써 불필요한 회전을 줄일 수 있어 효율적입니다.
이 코드의 시간 복잡도는 O(n)이며, 공간 복잡도는 O(n)입니다. 이는 배열을 한 번 순회하고, 동일한 크기의 임시 배열을 사용하기 때문입니다. 이 방법은 명확하고 직관적이며, 배열 회전 문제를 효과적으로 해결합니다.