akjfal

프로그래머스 68645번 java 본문

알고리즘/programmers

프로그래머스 68645번 java

akjfal 2021. 1. 14. 01:30

Programmers 코딩테스트 level 2 - 68645번 삼각달팽이

java로 작성했습니다.


생각한 점

  1. 코드를 작성할때 2차원 배열을 그린다고하면 좌표처럼 생각해 x변수는 넓이, y변수는 높이를 나타냅니다.
  2. 피라미드를 한쪽으로 몰았을 때 직각 삼각형과 같은 모양을 지니고 있어  2차원 배열의 절반과 가운데줄을 사용한것과 같은 배열을 보인다
  3. 1부터 진행시 n -> n -1 -> ... 1로 진행되어 전체 수를 n * (n - 1) / 2로 계산했다.
  4. 코딩 방식
    1. 1부터 n번 1자로 내려가면서 채우기
    2. 배열의 끝(처음에만 적용)이나 0이 아닌 숫자를 만나면 멈춤
    3. ㅡ자로 n-1번 채우기
    4. 배열의 끝(처음에만 적용)이나 0이 아닌 숫자를 만나면 멈춤
    5. 대각선 방향으로 n-2번 채우기
    6. 0이 아닌 숫자를 만나면 멈춤(배열의 끝은 만날일이 없으므로 고려 x)
    7. 1번으로 돌아간후 반복
    8. n * (n - 1) /2 번째 숫자가 채워지면 종료
    9. 배열을 재조합해서 1차원 배열로 변환

 

import java.util.*;

class Solution {
    public int[] solution(int n) {
        int[] answer;
        int[][] array = new int[n][n];
        int num = 2;
        int x = 0;
        int y = 0;
        // 0 - l, 1 - -, 2 - \
        int direction = 0;
        for (int i = 0; i < n; i++) {
            Arrays.fill(array[i], 0);
        }
        int max = (n * (n + 1)) / 2;
        array[0][0] = 1;
        while (num <= max) {
        // case 0 : 세로 방향
        // case 1 : 가로 방향
        // case 2 : 대각선 방향
            switch (direction % 3) {
                case 0: {
                    for (int i = y; i < n; i++) {
                        y++;
                        // 배열의 끝이나 가장자리 만나면 멈춤
                        if (y >= n || array[y][x] != 0) {
                            y--;
                            break;
                        } else {
                            array[y][x] = num;
                            num++;
                        }
                    }
                    break;
                }
                case 1: {
                    for (int i = x; i < n; i++) {
                        x++;
                        if (x >= n || array[y][x] != 0) {
                            x--;
                            break;
                        } else {
                            array[y][x] = num;
                            num++;
                        }
                    }
                    break;
                }
                case 2: {
                    for (int i = 0; i < n; i--) {
                        x--;
                        y--;
                        if (x < 0 || y < 0 || array[y][x] != 0) {
                            x++;
                            y++;
                            break;
                        } else {
                            array[y][x] = num;
                            num++;
                        }
                    }
                    break;
                }
            }
            direction++;
        }
        int k = 0;
        answer = new int[max];
		// 정답 계산 
        for (int i = 0; i < n; i++) {
            for (int j = 0; j <= i; j++) {
                answer[k] = array[i][j];
                k++;
            }
        }
        return answer;
    }
}
Comments