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);
    }
}