Codewars 문제풀기 (05/24)
Snail
-
n * n int 2d 배열을 입력 받는다.
-
이런 형태로 출력한다.
array = [[1,2,3],[4,5,6],[7,8,9]] snail(array) 👉 {1,2,3,6,9,8,7,4,5} array = { {1,2,3,1}, {4,5,6,4}, {7,8,9,7}, {7,8,9,7}} snail(array) 👉 {1,2,3,1,4,7,7,9,8,7,7,4,5,6,9,8}
1. Test와 리팩토링
-
테스트 1 - 입력 array length가 1일 때 (1x1)
-
테스트 2 - 입력 array length가 2일 때 (2x2)
-
테스트 3 - 입력 array length가 3일 때 (3x3)
-
테스트 4 - 입력 array length가 4일 때 (4x4)
-
테스트 5 - 입력 array length가 5일 때 (5x5)
-
테스트 6 - 입력 array length가 0
2. 답 비교, 느낀점
Best Practice 가장 많이 받은 코드
public class Snail {
public static int[] snail(int[][] array) {
if (array[0].length == 0) return new int[0];
int n = array.length;
int[] answer = new int[n*n];
int index=0;
for (int i = 0; i<n/2; i++){
for (int j = i; j < n-i; j++) answer[index++] = array[i][j];
for (int j = i+1; j < n-i; j++) answer[index++] = array[j][n-i-1];
for (int j = i+1; j < n-i; j++) answer[index++] = array[n-i-1][n-j-1];
for (int j = i+1; j < n-i-1; j++) answer[index++] = array[n-j-1][i];
}
if (n%2 != 0) answer[index++] = array[n/2][n/2];
return answer;
}
}
- 사실 이 문제 못 풀어서 답을 봤다. 그리고 답을 익힌후 2-3일동안 매일 다시 풀어보았다.
- 이 문제를 풀 때 재귀함수에 대한강의를 보고있었는데, 비슷한 예제가 있어서 이 문제도 재귀로 풀 수 있을거라 생각했다. 그래서 처음에는 재귀함수로 풀려고했다.
- 그런데 계속 막혔다.. 각 배열마다 방문했는지 boolean 배열을 두고, 각 index에서 👉👇👈☝방 향 순서로 index를 옮겨가며 재귀함수를 호출했다. 잘 동작하다가 ☝방향으로 가야하는 부분에서 👉방향으로 먼저 재귀함수를 호출해서 망했다..
- 재귀함수 강의 들을때 비슷한 문제가 있었는데 그게 가능했던 이유는 벽(block)element를 설정 해놓아서 그런것같다..
- 문제를 다시 풀면서 우선 하드코딩으로 작성한 뒤에 거기서 패턴을 찾는 방법도 좋은 방법인것 같다. 그리고 계속 리팩토링을 하면, 추상화 할 수 있다는것을 배웠다..
- 문제 어렵다 ㅜ 이런 문제도 못풀면 코테도 나가리아닌가 ㅜㅜㅜㅜ
댓글남기기