코테/프로그래머스

삼각 달팽이

이파댥 2024. 8. 6. 20:58

class Solution {
    public int[] solution(int n) {
        // 삼각형을 표현할 2 차원 배열과 채워넣을 숫자 선언
        int[][] triangle = new int[n][n];
        int v = 1; // v 는 채워넣을 숫자로 숫자를 triangle 에 기록할 때마다 1 씩 증가
        int x = 0; // 숫자 초기화 (0,0) 을 위해
        int y = 0;
        
        while (true) {
            // 아래로 이동하기
            while (true) {
                triangle[y][x] = v++; // 2 차원 배열은 y,x 로 생각해야함
                if (y + 1 == n || triangle[y + 1][x] != 0)
                    break;
                y += 1; // 아래로 진행하는 것은 y 값의 증가 때문이므로
            }
            // 오른쪽으로 이동할 수 있는 경우 반복문 탈출하도록 작성
            // 오른쪽으로 이동할 수 있을 때만 진행
            if (x + 1 == n || triangle[y][x + 1] != 0)
                break;
            x += 1;
            
            // 오른쪽으로 이동하기
            while(true) {
                triangle[y][x] = v++;
                if(x + 1 == n || triangle[y][x + 1] != 0)
                    break;
                x += 1;
            }
            if(triangle[y - 1][x - 1] != 0) 
                break;
            x -= 1;
            y -= 1;
            
            // 왼쪽으로 이동하기
            while(true) {
                triangle[y][x] = v++;
                if(triangle[y - 1][x - 1] != 0)
                    break;
                x -= 1;
                y -= 1;
            }
            if(y + 1 == n || triangle[y + 1][x] != 0)
                break;
            y += 1;
        }
        // 채운 숫자들을 1 차원 배열로 구성하여 반환
        // v 변수는 채워 넣은 마지막 숫자 + 1 이 있으므로  v - 1
        int[] result = new int[v - 1];
        
        // 2 차원 배열에서는 삼각형이 왼쪽으로 몰려 있는 직각 삼각형 모양으로 들어있다는 것을
        // 이용하여 이중 반복문으로 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;
    }
}