์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค ๋ณด๋ฉด ๋ฌธ์ ์ ๋ฌด๊ดํ ๋ถ๋ถ์์ ๋งํ ๋๊ฐ ์๋ค.
์ค๋ ์์๋ณผ ๋ฐฐ์ด shift๋ ๋น์ทํ ๋งฅ๋ฝ์ด๋ค.
๋ฐฐ์ด shift
๋ฌธ์ ํ์ด์ ๋ฐฐ์ด shift๋ฅผ ๊ตฌํํ๋ผ๋ ์์ผ๋ก ๋ฌธ์ ๊ฐ ์ถ์ ๋์ง ์๋๋ค.
์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ ๋, ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ์ข ์ข ๋ง์ฃผํ๋ค.
์.. ๊ฑฐ์ ๋ค ํ์๋๋ฐ ๋ฐฐ์ด์ ์๋ ์ ๋ค์ด ์ผ์ชฝ์ผ๋ก 5์นธ์ฉ๋ง ์์ง์ด๋ฉด ๋์ธ๋ฐ,,
์ด ๊ฒ์ ์ค์ ๋ก ๋ณธ์ธ์ด ํ๋ก๊ทธ๋๋จธ์ค ์ํฐ ์ฝ๋ฉ ์ฝํ ๋ฅผ ์งํํ๋ฉด์ ๋๊ผ์๋ ๊ฐ์ ์ด์๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ข ๋ ๋ช ํํ ์ด์ผ๊ธฐ ํด๋ณด์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๋ฐฐ์ด A๊ฐ ์ฃผ์ด์ง ๊ฒฝ์ฐ ์ผ์ชฝ(์ค๋ฅธ์ชฝ) ์ผ๋ก n์นธ shift ์ฐ์ฐ์ ์ํํ๋ผ.
์ข ๋ ์ฝ๊ฒ ์ ๊ทผํ๊ธฐ. hack !
๋ฐฐ์ด shift์๋ hack์ด ์กด์ฌํ๋ค.
์๋ฅผ ๋ค์ด์ arr = [1, 2, 3, 4, 5]
๋ผ๋ ๋ฐฐ์ด์ด ์๊ณ ์ค๋ฅธ์ชฝ์ผ๋ก 3์นธ ์ด๋ํ๋ผ๊ณ ๊ฐ์ ํด๋ณด์.
๊ทธ๋ผ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ค.
ํ์ง๋ง ๋ฐฐ์ด ๋ค์ง๊ธฐ๋ฅผ ์ด์ฉ ํ๋ค๋ฉด ๋์ฑ ๊ฐ๋จํ๊ฒ ํ ์ ์๋ค.
๋ฐฐ์ด ๋ค์ง๊ธฐ
๋ฐฐ์ด ๋ค์ง๊ธฐ๋ ๋ง ๊ทธ๋๋ก ๋ฐฐ์ด์ ์์๋ฅผ ๋ค์ง๋ ๊ฒ์ด๋ค.
arr = [1, 2, 3]
์ด๋ผ๋ ๋ฐฐ์ด์ ๋ค์ง์ผ๋ฉด?
arr = [3, 2, 1]
์ด ๋๋ ๊ฐ๋จํ ๋ ผ๋ฆฌ์ด๋ค.
์ด๋ฐ ๋ฐฐ์ด ๋ค์ง๊ธฐ๋ฅผ ์ด์ฉํ ๊ฒ์ธ๋ฐ, ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ค๋ฅธ์ชฝ shift์ฐ์ฐ์ผ๋ก n๋ฒ ์ด๋
- ๋ฐฐ์ด 0๋ฒ์งธ ์ธ๋ฑ์ค์์ n๋ฒ์งธ ์ธ๋ฑ์ค ๊น์ง ๋ค์ง๊ธฐ
- ๋ฐฐ์ด n๋ฒ์งธ ์ธ๋ฑ์ค์์ ๋ฐฐ์ด ๋ ์ธ๋ฑ์ค ๊น์ง ๋ค์ง๊ธฐ
- ์ ์ฒด ๋ฐฐ์ด ๋ค์ง๊ธฐ.
์ผ์ฉ shift ์ฐ์ฐ์ผ๋ก n๋ฒ ์ด๋
- ๋ฐฐ์ด ๋ ์ธ๋ฑ์ค์์ n๋ฒ์งธ ๊น์ง ๋ค์ง๊ธฐ
- ๋ฐฐ์ด 0๋ฒ์งธ ์ธ๋ฑ์ค์์ ๋ฐฐ์ด ๋์์ n๋ฒ์งธ ๋ฅผ ๋บธ ๋งํผ ๋ค์ง๊ธฐ
- ์ ์ฒด ๋ฐฐ์ด ๋ค์ง๊ธฐ
Java๋ก ๊ตฌํํ๊ธฐ
์ด์ ์๋ฐ๋ก ๊ตฌํํด๋ณด์.
์ ์ฒด ์์ค ์ฝ๋๋ฅผ ๋จผ์ ๋ณด์ฌ์ฃผ์๋ฉด.
public class ArrayShift {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int num = 3;
rightShift(arr, num);
System.out.println(Arrays.toString(arr));
leftShift(arr, num);
System.out.println(Arrays.toString(arr));
}
/* ๋ฐฐ์ด ๋ค์ง๊ธฐ๋ฅผ ์ํ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ผ๋ฆฌ ๋ณ๊ฒฝ ๋ฉ์๋ */
private static void swap(int[] arr, int idx1, int idx2) {
int temp = arr[idx1];
arr[idx1] = arr[idx2];
arr[idx2] = arr[idx2];
}
/* ๋ฐฐ์ด ์์ ์ธ๋ฑ์ค๋ถํฐ ๋ ์ธ๋ฑ์ค๊น์ง ๋ฐ๋ณต์ ๋๋ฉฐ swap์ ์งํํ ๋ฉ์๋*/
private static void reverse(int[] arr, int start, int end) {
int end = end - 1; // ๋ฐฐ์ด ๋ง์ง๋ง ์ธ๋ฑ์ค๋ ๋ฐฐ์ด ๊ธธ์ด - 1์ด๊ธฐ ๋๋ฌธ์
while(start < end) { // ๋ฐ๋ณต์ (start ~ end) -> (start + 1 ~ end - 1) ... ๊น์ง ์งํ
swap(arr, start, end);
start++;
end--;
}
}
private static void rightShift(int[] arr, int n) {
int size = arr.length;
reverse(arr, 0, n);
reverse(arr, n, size);
reverse(arr, 0, size)
}
private static void leftShift(int[] arr, int n) {
int size = arr.length;
reverse(arr, size - n, size);
reverse(arr, 0, size - n);
reverse(arr, 0, size);
}
}
์์ ๊ฐ๋ค.
์ฌ๊ธฐ์ ์กฐ๊ธ ํท๊ฐ๋ฆด ์ ์๋ ๋ฉ์๋๋ฅผ ์ค๋ช ํ์๋ฉด
reverse
private static void reverse(int[] arr, int start, int end) {
int end = end - 1;
while(start < end) {
swap(arr, start, end);
start++;
end--;
}
}
int end = end - 1;
: ๋ฐฐ์ด ๋ง์ง๋ง ์ธ๋ฑ์ค๋ ๋ฐฐ์ด ๊ธธ์ด - 1์ด๊ธฐ ๋๋ฌธ์while(start < end)
: ๋ฐ๋ณต์ (start ~ end) -> (start + 1 ~ end - 1) ...์ start๊ฐ ๋ฐ๊ฟ end๊ฐ ์์ ๋ ๊น์ง ์งํ
๋๊ธ