CodeWars 예순 아홉 번째 문제
Updated:
Fold an array
public static int[] foldArray(int[] array, int runs) {
int[] foldArray = null;
for(int i = 0; i < runs; i++) {
foldArray = fold(array);
array = foldArray;
}
return foldArray;
}
private static int[] fold(int[] array) {
int[] foldArray = allocateArray(array);
for(int i = 0; i < array.length/2 ; i++) {
foldArray[i] = array[i] + array[array.length-i-1];
}
if(array.length%2 == 1) {
foldArray[foldArray.length-1] = array[array.length/2];
}
return foldArray;
}
public static int[] allocateArray(int[] array) {
return new int[array.length%2 == 0? array.length/2 : array.length/2 + 1];
}
- 나의 경우 반 접을 때마다 그에 맞는 크기에 맞게 배열을 새로 생성하여 숫자들을 더 했다.
- 여기서 크기가 홀수이면 마지막 인덱스의 값을 넣어 주는 추가 코드가 발생했다.
- 그러나 배열의 크기가 엄청 크다면 재할당되는 메모리가 낭비가 될 수 있다는 생각을 했다.
- 그래서인지 Best 코드의 경우 넘어오는 파라미터를 그대로 사용하였다.
- 반을 접는 개념은 똑같지만 더해지는 범위가 줄어들므로 그 부분만 잘 계산하면 되었다.
import java.util.*;
public class Kata
{
public static int[] foldArray(int[] array, int runs) {
int[] arr = Arrays.copyOf(array, array.length);
int bound = arr.length;
for (int k = 0; k < runs; k++) {
for (int i = 0; i < bound / 2; i++) {
arr[i] += arr[bound - 1 - i];
}
bound = (bound + 1) / 2;
}
return Arrays.copyOf(arr, bound);
}
}