유블로그

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

알고리즘

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

yujeong kang 2021. 1. 15. 13:23

프로그래머스 level2 삼각달팽이

 

소요시간 : 18분

 

방향이 3가지가 있어서

1 - i만 증가

2 - j만 증가

3 - i 감소 j 감소

이 3가지 방향을 차례대로 반복했다.

 

i 나 j 인덱스가 벗어나거나 이미 값이 들어간 곳에 도착하면

방향을 바꿔주면 된다.

 

1 + 2 + ... + n  = n(n+1)/2 개만큼 돌면 break 한다.

 

풀고나서 다른 사람 풀이를 보니 i % 3 == 0 이면 i++, i % 3 == 1이면 j++, i % 3 == 2 이면 i--, j-- 이렇게

for문 두개 안에서 간단하게 풀이를 했는데 진짜 괜찮은 방법인 것 같다.

 

class Solution {
    public int[] solution(int n) {
        int[][] arr = new int[n][];
        for (int i = 0; i < n; i++) {
            arr[i] = new int[i+1];
        }

        int[][] dir = { {1, 0}, {0, 1}, {-1, -1}};
        int num = 1, i = 0, j = 0, d = 0, count = 0;
        while(true) {
            if(count == n*(n+1)/2) break;

            if(i >= n || i < 0 || arr[i].length <= j || arr[i][j] != 0) {
                i -= dir[d][0];
                j -= dir[d][1];
                d++;
                d %= 3;
                i += dir[d][0];
                j += dir[d][1];
            }

            arr[i][j] = num++;

            i += dir[d][0];
            j += dir[d][1];

            count++;
        }

        int[] answer = new int[num-1];
        i = 0;
        for (int k = 0; k < arr.length; k++) {
            for (int k2 = 0; k2 < arr[k].length; k2++) {
                answer[i++] = arr[k][k2];
            }
        }

        return answer;
    }
}