반응형
- 첫 풀이
처음 풀 때 무슨 규칙이 있을까 하고 찾아보았지만, 본인이 못 찾는 건지 규칙이라고는 발견할 수 없었다. 다른 분들의 풀이 또한 특별한 규칙이 있는 것이 아닌, 문제 자체에서 제시하는 조건을 이용해 푼 사람들이 많았다.
- 정답풀이
이 문제는 문제에서 제시하는 것처럼 반시계 방향으로 숫자를 증가시켜주면 된다. 데이터의 저장은 2차원 배열을 왼쪽 정렬하면 표현할 수 있으며, 아래 및 오른쪽 진행은 각각 행, 열이 증가하고 대각선 좌상 향은 행, 열이 모두 감소한다는 점을 조건으로 잘 사용하면 된다.
또한 규칙을 찾으면서 발견할 수 있었던 점을 활용하였는데, n이 4일 때 반시계 방향으로 진행할 때 1~4까지 아래 방향으로 수행한 뒤, 5~7까지 오른쪽 방향으로 수행한 뒤, 8~9까지 좌상 향 대각선 방향으로 진행.. 과 같은 식으로 방향이 바뀔 때마다 수를 채우는 연산이 n-1씩 나타난다. 즉, n이 0이 되면 모든 과정을 마치고 모든 수를 채워야 한다. 이를 활용해 반복문을 작성한다.
import java.util.ArrayList;
class Solution {
public ArrayList<Integer> solution(int n) {
// 1. 정답을 담을 ArrayList.
ArrayList<Integer> answer = new ArrayList<>();
// 2. 수를 저장 할 2차원 배열.
int[][] arr = new int[n][n];
// 3. 증가하는 수 num, 행 row, 열 col.
int num = 0, row =0, col=0;
// 4. 아래, 오른쪽, 좌상향 대각선 방향을 구분하기 위한 flag.
char flag = 'a';
// 5. n!=0이면 아직 수를 다 채우지 못했다.
while(n!=0){
// 6. n, n-1, n-2... 순으로 수를 채우는 반복횟수가 줄어든다.
for(int i = 0 ;i<n;i++){
switch(flag){
case 'a': // 아래 방향 진행
// 열인 col은 고정한 채 행인 row만 증가시킨다.
arr[row][col] = ++num;
row++;
break;
case 'b': // 오른쪽 방향 진행
// 행인 row를 고정한 채 열인 col만 증가시킨다.
arr[row][col] = ++num;
col++;
break;
case 'c': // 좌상향 대각선 방향 진행
// 행, 열 모두 1씩 감소해 대각선 방향으로 이동한다.
arr[row][col] =++num;
row--;
col--;
break;
}
}
switch(flag){
case 'a': // 아래쪽 방향 진행
// 다음 열부터 채우기 위해 col++, row는 반복문을 마치면서 n이 되므로 -1을 수행, flag 변경.
col++;
row--;
flag = 'b';
break;
case 'b': // 오른쪽 방향 진행
// 좌상향 대각선의 시작위치를 위해 열은 -2, 행은 -1을 수행, flag 변경.
col-=2;
row--;
flag = 'c';
break;
case 'c': // 좌상향 대각선 방향 진행.
// 마찬가지로 아래방향 진행 시작위치를 위해 행은 +2, 열은 +1을 수행, flag 변경.
row+=2;
col++;
flag = 'a';
break;
}
// 7. n의 크기를 감소.
n--;
}
// 8. 행 순서대로 0이 아닌 경우만 ArrayList에 담아준다.
for(int i =0;i<arr.length;i++){
for(int j =0;j<arr[i].length;j++){
if(arr[i][j] == 0) break;
answer.add(arr[i][j]);
}
}
return answer;
}
}
반응형