1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
class Solution {
public int[] solution(int n) {
int[] answer = {};
int[][] snail = new int[n][n];
int i, j;
int cnt = 1, row = 0, col = 0;
if(n == 1){
answer = new int[1];
answer[0] = 1;
return answer;
}
while (col != n / 2) {
// 세로
for (i = row; i < n - col; i++) {
snail[i][col] = cnt++;
}
col++;
// 가로
for (i = col; i < n - row; i++) {
snail[n - col][i] = cnt++;
}
// 대각선
for (i = col; i < n - col; i++) {
// 영역 침범하는 경우 예외 처리
if (snail[n - i - 1][n - i - col] != 0) {
break;
}
snail[n - i - 1][n - i - col] = cnt++;
}
row = n - i + 1;
}
answer = new int[cnt - 1];
cnt = 0;
// 일차원 배열에 값 저장
for (i = 0; i < n; i++) {
for (j = 0; j < i + 1; j++) {
answer[cnt++] = snail[i][j];
}
}
return answer;
}
}
|
cs |
여러 시행착오를 거쳐서 세로, 가로, 대각선 순으로 채우는 공식을 구현하였다.
이 때 대각선에서 영역을 침범하는 경우가 생겨 예외처리 하였고, n = 1인 경우에도 예외처리 하였다.
다른 사람이 푼 괜찮은 코드도 가져왔다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
class Solution {
public int[] solution(int n) {
int[] answer = new int[(n*(n+1))/2];
int[][] matrix = new int[n][n];
int x = -1, y = 0;
int num = 1;
for (int i = 0; i < n; ++i) {
for (int j = i; j < n; ++j) {
if (i % 3 == 0) {
++x;
} else if (i % 3 == 1) {
++y;
} else if (i % 3 == 2) {
--x;
--y;
}
matrix[x][y] = num++;
}
}
int k = 0;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j) {
if(matrix[i][j] == 0) break;
answer[k++] = matrix[i][j];
}
}
return answer;
}
}
|
cs |
i의 값에 따라 세로, 가로, 대각선 순으로 채우는 공식이다.
이 때 좌표 값을 계산하는 과정이 매우 간단하다.
값을 채우는 횟수가 n부터 1씩 감소되는 것을 이용하였다.
'Programmers > Level2' 카테고리의 다른 글
가장 큰 정사각형 찾기 (0) | 2021.07.24 |
---|---|
[1차] 캐시 (0) | 2021.07.24 |
다리를 지나는 트럭 (0) | 2021.07.23 |
멀쩡한 사각형 (0) | 2021.07.23 |
주식가격 (0) | 2021.07.23 |