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;
}
- 코드가 훨씬 간결하다.
- 나와 같은 재귀로 풀었으나 나보다 동적인 프로그래밍 냄새가 난다.
- 아직 여기까지는 무리인가 보다