CodeWars 일백 세 번째 문제

Updated:

Matrix Determinant

public static int determinant(int[][] matrix) {

    if(matrix.length == 1) {
        return matrix[0][0];
    }else if(matrix.length == 2 ) {
        return matrix[0][0]* matrix[1][1] - matrix[0][1]*matrix[1][0];
    } else {
        int sum = 0;

        for(int j = 0; j < matrix.length; j++) {
            sum += matrix[0][j] * deter(matrix, j) * (j % 2 == 0 ? 1 : -1);
        }

        return sum;
    }
}

private static int deter(int[][] matrix, int j) {

    int[][] smallMatrix = makeSmallMatrix(matrix, j);

    if(smallMatrix.length == 2) {
        return smallMatrix[0][0]* smallMatrix[1][1] - smallMatrix[0][1]*smallMatrix[1][0];
    } 

    int sum = 0;

    for(int y = 0; y < smallMatrix.length; y++) {
        sum += smallMatrix[0][y] * deter(smallMatrix, y) * (y % 2 == 0 ? 1 : -1);
    }

    return sum;
}

private static int[][] makeSmallMatrix(int[][] matrix, int j) {
    int[][] smallMatrix = new int[matrix.length -1][matrix.length -1];

    for(int x1 = 0, x2 = 1; x1 < smallMatrix.length; x1++, x2++) {

        for(int y1 = 0, y2 = 0; y1 < smallMatrix.length; y1++, y2++) {
            if(y1 == j) {
                y2++;
            }

            smallMatrix[x1][y1] = matrix[x2][y2];
        }
    }

    return smallMatrix;
}
  • 문과 출신이라.. (공대긴 하지만 수학을 전혀 안했다.) 행렬식을 처음 알았다.
  • 단순 2 X 2의 역행렬 조건을 알았지만 그 이상은 배운적이 없기 때문이다.
  • 그래서 공식을 익히는데 많은 시간을 잡아 먹었다.
  • 그리고 그 공식을 코드로 구현하기 위해 재귀함수를 쓰는데 또 애를 먹었다.
  • 그래도 지금까지 공부했던 재귀함수가 잘 먹혀서 다행이다.
  • 그렇지만 !! 역시나 BEST CODE는 나보다 더 간단하게 풀었다.

BEST CODE

public static int determinant2(int[][] m) {
        int d = 0, size = m.length;
        if (size == 1) return m[0][0];
        
		for (int n = 0; n < size; n++) {
			int[][] newM = new int[size - 1][size - 1];
			
			for (int x = 1; x < size; x++) {
				for (int y = 0; y < size; y++) {
					if (y == n) {
						continue;
					}
					
					newM[x - 1][y + (y > n ? -1 : 0)] = m[x][y];
				}
			}
			
			d += (n % 2 != 0 ? -1 : 1) * m[0][n] * determinant2(newM);
		}
        return d;
    }
  • 코드가 훨씬 간결하다.
  • 나와 같은 재귀로 풀었으나 나보다 동적인 프로그래밍 냄새가 난다.
  • 아직 여기까지는 무리인가 보다