๋ฌธ์ ํ์
์ ์ ๋ฐฐ์ด nums
๊ฐ ์ฃผ์ด์ง๋ค. ์์๊ฐ ์๋ k
๋งํผ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐฐ์ด์ ํ์ ์์ผ์ผ ํ๋ค.
ํ์ด
1๏ธโฃ ๋ฐฐ์ด 2๊ฐ๋ฅผ ์ด์ฉํ ํ์ด
๋จผ์ , ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง k
๋ฅผ ํ๋ฒ ์ ์ฒ๋ฆฌ ํด์ผํ๋ค.
์๋ํ๋ฉด, ๊ธธ์ด๊ฐ N์ธ ๋ฐฐ์ด nums
๋ฅผ N๋ฒ rotate ํ๋ฉด ์์ํ๋ก ๋์์ค๊ธฐ ๋๋ฌธ์
k
๋ฅผ N
์ผ๋ก ๋๋ ๋๋จธ์ง๋งํผ๋ง rotate ํ๋ค๊ณ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฌ๋ฉด, ์ด๋์ํฌ ์์์ ๊ฐ์๋ k%N ๊ฐ๊ฐ ๋๋ค.
์ด๋ ์ํฌ ๋ถ๋ถ์ tmp๋ผ๋ ๋ฐฐ์ด์ ์ ์ํด์ ๋ด์ฉ์ ๋ณต์ฌํด๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์์๋ถํฐ ์ด๋์ํจ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ณด๊ดํด๋์๋ ๋ด์ฉ์ ์์ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
class Solution {
public void rotate(int[] nums, int k) {
int N = nums.length;
k = k % N;
int[] tmp = new int[k];
for (int i = 0; i < k; i++) {
tmp[i] = nums[N - k + i];
}
for (int i = N - 1; i >= k; i--) {
nums[i] = nums[i - k];
}
for (int i = 0; i < k; i++) {
nums[i] = tmp[i];
}
}
}
๊ฒฐ๊ณผ
ํต๊ณผ๋ ํ์ง๋ง, ๋๋ฌด ์ง๊ด์ ์ผ๋ก ํผ ๋๋์ด ์์๋ค.
๊ทธ๋ฆฌ๊ณ , O(1) ๊ณต๊ฐ ๋ณต์ก๋ ๋ฐฉ์์ผ๋ก ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ํ์ฌ ๊ณ ๋ฏผ์ ํด๋ณด์๋ค.
2๏ธโฃ ์์ ํ ๊ฐ์ฉ ์ด๋ํ๋ ํ์ด - ์๊ฐ ์ด๊ณผ
๊ณต๊ฐ ๋ณต์ก๋๋ฅผ O(1) ๋ก ํ๊ธฐ ์ํด์
์์ ํ๊ฐ๋ฅผ ์์๋ก ์ ์ฅํ ์ ์๋ ๋ณ์ ํ๋๋ง ์ฌ์ฉํด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๊ณ , ๋ฐ๋ผ์ ํ ๊ฐ์ฉ ์ด๋ํ๋ ํ์ด๋ฅผ ์๊ฐํ๋ค.
class Solution {
public void rotate(int[] nums, int k) {
int N = nums.length;
k = k % N;
while (k-- > 0) {
int tmp = nums[N - 1];
for (int i = N - 1; i >= 1; i--) {
nums[i] = nums[i - 1];
}
nums[0] = tmp;
}
}
}
k
๋ฒ rotate๋ฅผ ํด์ผํ๊ณ
์ ์ผ ๋ค์ ์๋ ์์๋ฅผ tmp
๋ณ์์ ์์๋ก ์ ์ฅํด๋ ํ
๋ชจ๋ ์์๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ์ฉ ์ด๋ํ๊ณ
๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์์ ์์๋ก ์ ์ฅํด๋์๋ ๋ณ์๋ฅผ ์ ๋ ฅํ๋ ๋ฐฉ์์ผ๋ก rotate ์์ผฐ๋ค.
ํ์ง๋ง, ์ด ๋ฐฉ์์ ์๊ฐ ๋ณต์ก๋๊ฐ ์ต์ ์ ๊ฒฝ์ฐ ๊ฑฐ์ O(N^2) ์ธ ๋ฐฉ์์ด ๋๋ฒ๋ฆฐ๋ค.
๋ฐ๋ผ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํด๋ฒ๋ ธ๋ค.
๊ฒฐ๊ณผ
3๏ธโฃ ๊ณต๊ฐ ๋ณต์ก๋ O(1) ํ์ด
์ฝ 1์๊ฐ์ ๊ณ ๋ฏผํ์ง๋ง, ๋ ์ค๋ฅด์ง ์์๊ณ ๊ฒฐ๊ตญ ๋ค๋ฅธ ์ฌ๋์ ํ์ด๋ฅผ ์ฐธ๊ณ ํ๊ฒ ๋์๋ค.
์ด ๋ฐฉ๋ฒ ์ญ์, ์ด๋์ ๋ ์ ๋ฆฝ๋ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ๋ ๋ฌธ์ ์๋ค.
์ด๋ ํ ๋ฐฉํฅ์ผ๋ก k๋ฒ ํ์ ํ ๋ ์ฌ์ฉํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ
๋จผ์ , ๋ ๋ธ๋ญ์ผ๋ก ๋ฐฐ์ด์ ๋๋๋ค.
๋ค์์ ๋ถํฐ k
๊ฐ ๊น์ง๋ ์์ผ๋ก ๋ฐ๋ ค๋ ๊ฒ์ด๋ฏ๋ก ์์ ๊ฐ์ด ๋๋์๋ค.
โ ๋ง์ฝ ์ผ์ชฝ์ผ๋ก ํ์ ํ๋ ๋ฐฐ์ด์ด๋ผ๋ฉด?
์์ ๊ฐ์ด ๋๋ ์ผ ํ ๊ฒ์ด๋ค.
์๋ํ๋ฉด,k(3)
๋งํผ ์ผ์ชฝ์ผ๋ก ํ์ ํ๋ฉด ๋ค๋ก ๋ฐ๋ ค๋๋ ๋ฐฐ์ด ๋ถ๋ถ์ ์์์๋ถํฐk
๊ฐ ๊น์ง ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ ๋ธ๋ญ์ ์์๋ฅผ ์ญ์์ผ๋ก reverse()
ํ๋ค
๋ ๋ธ๋ญ์ ํฉ์น๊ณ ์ ์ฒด ๋ฐฐ์ด์ ์ญ์์ผ๋ก reverse()
ํ๋ค.
๊ทธ๋ฌ๋ฉด ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
๐ก ์ ๋ฆฌํด๋ณด๋ฉด
1. ์ผ์ชฝ์ด๋ ์ค๋ฅธ์ชฝ์ด๋ ํ ๋ฐฉํฅ์ผ๋ก ํ์ ํ๋ ๋ฐฐ์ด์ด ์กด์ฌํ ๋, ๋ฐ๋ ค๋๋ ๋ถ๋ถ๊ณผ ๋ฐ๋ ค๋์ง ์๋ ๋ถ๋ถ์ผ๋ก 2๊ฐ์ ๋ธ๋ญ์ผ๋ก ๋๋๋ค.
2. ๋ ๊ฐ์ ๋ธ๋ญ์ ๊ฐ๊ฐreverse()
ํ๋ค.
3. ํฉ์น ๋ค์, ์ ์ฒด ๋ฐฐ์ด์reverse()
ํ๋ค.
์ด ๋ฐฉ๋ฒ์ด๋ผ๋ฉด, ๊ณต๊ฐ ๋ณต์ก๋ O(1) ๋ก ํด๊ฒฐํ ์ ์๋ค!
class Solution {
public void rotate(int[] nums, int k) {
int N = nums.length;
k = k % N;
// 1๋ฒ์งธ ๋ธ๋ญ ์ญ์
reverse(nums, 0, N - 1 - k);
// 2๋ฒ์งธ ๋ธ๋ญ ์ญ์
reverse(nums, N - k, N - 1);
// ์ ์ฒด ๋ธ๋ญ ์ญ์
reverse(nums, 0, N - 1);
}
private void reverse(int[] nums, int start, int end) {
while (start < end) {
int tmp = nums[start];
nums[start] = nums[end];
nums[end] = tmp;
start++;
end--;
}
}
}
๊ฒฐ๊ณผ
๐ ํ๊ณ
ํ์คํ LeetCode์์ ์๊ตฌํ๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ํ์ด๋, ํน์ ๊ธฐ๋ฒ์ ์จ์ผ ํ๋ฆฌ๋ ๊ฒ ๊ฐ๋ค.
๋ฌผ๋ก , ์ด ๊ธฐ๋ฒ์ ๋จธ๋ฆฟ์์ผ๋ก ๋ ์ฌ๋ฆฌ๋ ์ฒ์ฌ๋ ์๊ฒ ์ง๋ง ๋๋ ๊ทธ๋ ์ง ๋ชปํ ๊ฒ ๊ฐ๋ค...ใ
์ด๋ฌํ ๊ธฐ๋ฒ๋ค์ ์ฌ๋งํ๋ฉด ์๊ณ ์์ผ๋ฉด ์ข์ผ๋ ๋ฐ๋ก ๊ฐ๋จํ๊ฒ ์ ๋ฆฌ๋ฅผ ๋ ํด์
๊น๋จน์๋์ฏค ํ๋ฒ ๋ ๋ณด๊ณ , ๋จธ๋ฆฟ์์ ๊ธฐ์ตํด๋๊ณ ์์ด์ผ๊ฒ ๋ค.