# ๋ฐฐ์ด (Array)
- C++์์ ์ฌ์ด์ฆ ๊ตฌํ๊ธฐ
int arr[] = { 1, 2, 3, 4, 5, 6, 7 };
int n = sizeof(arr) / sizeof(arr[0]); // 7
# ๋ฐฐ์ด ํ์ ํ๋ก๊ทธ๋จ
์ ์ฒด ์ฝ๋๋ ๊ฐ ํ์ดํผ๋งํฌ๋ฅผ ๋๋ฌ์ฃผ์๋ฉด ์ด๋๋ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ธ ํ์ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ (opens new window)
temp๋ฅผ ํ์ฉํด์ ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค ๊ฐ์ ์ ์ฅ ํ arr[0]~arr[n-1]์ ๊ฐ๊ฐ arr[1]~arr[n]์ ๊ฐ์ ์ฃผ๊ณ , arr[n]์ temp๋ฅผ ๋ฃ์ด์ค๋ค.
void leftRotatebyOne(int arr[], int n){ int temp = arr[0], i; for(i = 0; i < n-1; i++){ arr[i] = arr[i+1]; } arr[i] = temp; }
์ด ํจ์๋ฅผ ํ์ฉํด ์ํ๋ ํ์ ์ ๋งํผ for๋ฌธ์ ๋๋ ค ๊ตฌํ์ด ๊ฐ๋ฅ
์ ๊ธ๋ง ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ (opens new window)
์ต๋๊ณต์ฝ์ gcd๋ฅผ ์ด์ฉํด ์งํฉ์ ๋๋์ด ์ฌ๋ฌ ์์๋ฅผ ํ๊บผ๋ฒ์ ์ด๋์ํค๋ ๊ฒ
์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ฐฐ์ด์ด ์๋์ ๊ฐ๋ค๋ฉด
arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
1,2,3์ ๋ค๋ก ์ฎ๊ธธ ๋, ์ธ๋ฑ์ค๋ฅผ 3๊ฐ์ฉ ๋ฌถ๊ณ ํ์ ์ํค๋ ๋ฐฉ๋ฒ์ด๋ค.
a) arr [] -> { 4 2 3 7 5 6 10 8 9 1 11 12}
b) arr [] -> {4 5 3 7 8 6 10 11 9 1 2 12}
c) arr [] -> {4 5 6 7 8 9 10 11 12 1 2 3 }
์ญ์ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ (opens new window)
ํ์ ์ํค๋ ์์ ๋ํด ๊ตฌ๊ฐ์ ๋๋์ด reverse๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ
d = 2์ด๋ฉด
1,2 / 3,4,5,6,7๋ก ๊ตฌ๊ฐ์ ๋๋๋ค.
์ฒซ๋ฒ์งธ ๊ตฌ๊ฐ reverse -> 2,1
๋๋ฒ์งธ ๊ตฌ๊ฐ reverse -> 7,6,5,4,3
ํฉ์น๊ธฐ -> 2,1,7,6,5,4,3
ํฉ์น ๋ฐฐ์ด์ reverse -> 3,4,5,6,7,1,2
- swap์ ํตํ reverse
void reverseArr(int arr[], int start, int end){ while (start < end){ int temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; start++; end--; } }
โ
- ๊ตฌ๊ฐ์ d๋ก ๋๋์์ ๋ ์ญ์ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
void rotateLeft(int arr[], int d, int n){ reverseArr(arr, 0, d-1); reverseArr(arr, d, n-1); reverseArr(arr, 0, n-1); }
# ๋ฐฐ์ด์ ํน์ ์ต๋ ํฉ ๊ตฌํ๊ธฐ
์์) arr[i]๊ฐ ์์ ๋, i*arr[i]์ Sum์ด ๊ฐ์ฅ ํด ๋ ๊ทธ ๊ฐ์ ์ถ๋ ฅํ๊ธฐ
(ํ์ ํ๋ฉด์ ์ต๋๊ฐ์ ์ฐพ์์ผํ๋ค.)
Input: arr[] = {1, 20, 2, 10}
Output: 72
2๋ฒ ํ์ ํ์ ๋ ์๋์ ๊ฐ์ด ์ต๋๊ฐ์ด ๋์ค๊ฒ ๋๋ค.
{2, 10, 1, 20}
20*3 + 1*2 + 10*1 + 2*0 = 72
Input: arr[] = {10, 1, 2, 3, 4, 5, 6, 7, 8, 9};
Output: 330
9๋ฒ ํ์ ํ์ ๋ ์๋์ ๊ฐ์ด ์ต๋๊ฐ์ด ๋์ค๊ฒ ๋๋ค.
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
0*1 + 1*2 + 2*3 ... 9*10 = 330
# ์ ๊ทผ ๋ฐฉ๋ฒ
arr[i]์ ์ ์ฒด ํฉ๊ณผ i*arr[i]์ ์ ์ฒด ํฉ์ ์ ์ฅํ ๋ณ์ ์ ์ธ
์ต์ข ๊ฐ์ฅ ํฐ sum ๊ฐ์ ์ ์ฅํ ๋ณ์ ์ ์ธ
๋ฐฐ์ด์ ํ์ ์ํค๋ฉด์ i*arr[i]์ ํฉ์ ๊ฐ์ ์ ์ฅํ๊ณ , ๊ฐ์ฅ ํฐ ๊ฐ์ ์ ์ฅํด์ ์ถ๋ ฅํ๋ฉด ๋๋ค.
# ํด๊ฒฐ๋ฒ
ํ์ ์์ด i*arr[i]์ sum์ ์ ์ฅํ ๊ฐ
R0 = 0*arr[0] + 1*arr[1] +...+ (n-1)*arr[n-1]
1๋ฒ ํ์ ํ๊ณ i*arr[i]์ sum์ ์ ์ฅํ ๊ฐ
R1 = 0*arr[n-1] + 1*arr[0] +...+ (n-1)*arr[n-2]
์ด ๋๊ฐ๋ฅผ ๋นผ๋ฉด?
R1 - R0 = arr[0] + arr[1] + ... + arr[n-2] - (n-1)*arr[n-1]
2๋ฒ ํ์ ํ๊ณ i*arr[i]์ sum์ ์ ์ฅํ ๊ฐ
R2 = 0*arr[n-2] + 1*arr[n-1] +...+ (n?1)*arr[n-3]
1๋ฒ ํ์ ํ ๊ฐ๊ณผ ๋นผ๋ฉด?
R2 - R1 = arr[0] + arr[1] + ... + arr[n-3] - (n-1)*arr[n-2] + arr[n-1]
์ฌ๊ธฐ์ ๊ท์น์ ์ฐพ์ ์ ์์.
Rj - Rj-1 = arrSum - n * arr[n-j]
์ด๋ฅผ ํ์ฉํด์ ๋ช๋ฒ ํ์ ํ์ ๋ ์ต๋๊ฐ์ด ๋์ค๋ ์ง ๊ตฌํ ์ ์๋ค.
๊ตฌํ ์์ค ์ฝ๋ ๋งํฌ (opens new window)
# ํน์ ๋ฐฐ์ด์ arr[i] = i๋ก ์ฌ๋ฐฐ์ด ํ๊ธฐ
์์) ์ฃผ์ด์ง ๋ฐฐ์ด์์ arr[i] = i์ด ๊ฐ๋ฅํ ๊ฒ๋ง ์ฌ๋ฐฐ์ด ์ํค๊ธฐ
Input : arr = {-1, -1, 6, 1, 9, 3, 2, -1, 4, -1}
Output : [-1, 1, 2, 3, 4, -1, 6, -1, -1, 9]
Input : arr = {19, 7, 0, 3, 18, 15, 12, 6, 1, 8,
11, 10, 9, 5, 13, 16, 2, 14, 17, 4}
Output : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19]
arr[i] = i๊ฐ ์์ผ๋ฉด -1๋ก ์ฑ์ด๋ค.
# ์ ๊ทผ ๋ฐฉ๋ฒ
arr[i]๊ฐ -1์ด ์๋๊ณ , arr[i]์ด i๊ฐ ์๋ ๋๊ฐ ์ฐ์ ์กฐ๊ฑด
ํด๋น arr[i] ๊ฐ์ ์ ์ฅ(x)ํด๋๊ณ , ์ด ๊ฐ์ด x์ผ ๋ arr[x]๋ฅผ ํ์
arr[x] ๊ฐ์ ์ ์ฅ(y)ํด๋๊ณ , arr[x]๊ฐ -1์ด ์๋๋ฉด์ arr[x]๊ฐ x๊ฐ ์๋ ๋์์ ํ์
arr[x]๋ฅผ x๊ฐ์ผ๋ก ์ ์ฅํด์ฃผ๊ณ , ๊ธฐ์กด์ x๋ฅผ y๋ก ์์
int fix(int A[], int len){
for(int i = 0; i < len; i++) {
if (A[i] != -1 && A[i] != i){ // A[i]๊ฐ -1์ด ์๋๊ณ , i๋ ์๋ ๋
int x = A[i]; // ํด๋น ๊ฐ์ x์ ์ ์ฅ
while(A[x] != -1 && A[x] != x){ // A[x]๊ฐ -1์ด ์๋๊ณ , x๋ ์๋ ๋
int y = A[x]; // ํด๋น ๊ฐ์ y์ ์ ์ฅ
A[x] = x;
x = y;
}
A[x] = x;
if (A[i] != i){
A[i] = -1;
}
}
}
}
๊ตฌํ ์์ค ์ฝ๋ (opens new window)