본문 바로가기

Programmers/Level2

삼각 달팽이

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] == 0break;
                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