본문 바로가기

알고리즘

프로그래머스 - 삼각 달팽이(Java)

단순 구현 문제입니다.

그림과 같이 값을 채우기 위해서는 세 번의 연산이 필요합니다.

  1. 세로 N번
  2. 가로 N-1번
  3. 대각선 N-2번

세로, 가로 대각선을 채울 때 마다 N은 3이 줄어들어 줄어든 N을 사용하여 내부를 채우면 됩니다.

 

[구현 코드]

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Solution {
    private static int[][] map;
    private static int num, row, col;

    public static int[] solution(int n) {
        map = new int[n + 1][n + 1];

        row = -1;
        col = 0;

        for (int i = n; i > 0; i-=3) {
            fillCol(i); // 세로
            fillRow(i); // 가로
            fillDia(i); // 대각선
        }

        List<Integer> ans = new ArrayList<>();
        for(int i=0; i<n; i++){
            for(int j=0; j<i+1; j++){
                ans.add(map[i][j]);
            }
        }

        return Arrays.stream(ans.toArray(new Integer[0])).mapToInt(Integer::intValue).toArray();
    }

    private static void fillDia(int k) {
        for(int j=0; j<k-2; j++){
            map[--row][--col] = ++num;
        }
    }

    private static void fillRow(int k) {
        for(int j=0; j<k-1; j++){
            map[row][++col] = ++num;
        }
    }

    private static void fillCol(int k) {
        for(int j=0; j<k; j++){
            map[++row][col] = ++num;
        }
    }
}