개발 공부/알고리즘

[프로그래머스] 삼각 달팽이

감자민성 2024. 1. 3. 13:41

1. 문제

2. 풀이

1) 첫 번째 풀이

public int[] solution1(int n) {
        int max_num = n * (n + 1) / 2;
        int[] answer = new int[max_num];
        int[][] triangle = new int[n][n];


        int x = 0;
        int y = 0;

        int num = 1;
        int v = n;
        while (v > 0) {
            // 아래로 이동
            for (int i = 0; i < v; i++) {
                triangle[y++][x] = num;
                num++;
            }
            y--; // index 범위 벗어남 다시 제자리로
            x++; // 다음 위치로 이동
            v--;

            for (int i = 0; i < v; i++) {
                triangle[y][x++] = num;
                num++;
            }
            x--; // index 범위 벗어남 다시 제자리로
            x--;
            y--; // 다음 위치로 이동
            v--;

            for (int i = 0; i < v; i++) {
                triangle[y--][x--] = num;
                num++;
            }
            x++;
            y++; // index 범위 벗어남 다시 제자리로
            y++; // 다음 위치로 이동
            v--;
        }
        int index = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j <= i; j++) {
                answer[index++] = triangle[i][j];
            }
        }
        return answer;
    }

처음 생각한 풀이이다.
우선 달팽이를 채우는 순서는 1. 아래방향으로 이동 2. 오른쪽으로 이동 3. 대각선 위로 이동이고 이것을 총 n번 실행하게 되며

또한 처음 아래방향으로 이동할 땐 n번 아래로 이동, 그다음 오른쪽으로 이동할 땐 n-1번, 그다음 대각선으로 이동할 땐 n-2 번 이동하게 되어 n(v)이 0보다 작아질 때까지 반복문을 이용하여 이동하게 해 주었다.

2) dx, dy를 이용한 두 번째 풀이

private static final int[] dx = {0, 1, -1};
private static final int[] dy = {1, 0 , -1};

    public int[] solution2(int n) {
        int[][] triangle = new int[n][n];
        int v = 1;
        int x = 0;
        int y = 0;
        int d = 0;

        while(true){
            triangle[y][x] = v++;
            int nx = x + dx[d];
            int ny = y + dy[d];
            if(nx == n || ny == n || nx == -1 || ny == -1 || triangle[ny][nx] != 0){
                d = (d + 1) % 3;
                nx = x + dx[d];
                ny = y + dy[d];
                if(nx == n || ny == n || nx == -1 || ny == -1 || triangle[ny][nx] != 0) break;
            }
            x = nx;
            y = ny;
        }

        int[] result = new int[v - 1];
        int index = 0;
        for(int i = 0 ; i < n; i++){
            for(int j = 0; j <= i; j++){
                result[index++] = triangle[i][j];
            }
        }
        return result;
    }

 

구현을 더 간단하고 쉽게 하기 위해 dx, dy로 방향을 설정해 주었다. 이로써 디버깅을 쉽게 할 수 있게 하고 구현방법을 바꾸어야 할 때 다량의 코드를 수정할 필요 없게 되고 직관적으로 문제를 풀 수 있었다.