[프로그래머스,Level 2] 삼각 달팽이(JAVA 구현)
코테/프로그래머스(Programmers)

[프로그래머스,Level 2] 삼각 달팽이(JAVA 구현)

반응형

- 첫 풀이

  처음 풀 때 무슨 규칙이 있을까 하고 찾아보았지만, 본인이 못 찾는 건지 규칙이라고는 발견할 수 없었다. 다른 분들의 풀이 또한 특별한 규칙이 있는 것이 아닌, 문제 자체에서 제시하는 조건을 이용해 푼 사람들이 많았다.

 

- 정답풀이

  이 문제는 문제에서 제시하는 것처럼 반시계 방향으로 숫자를 증가시켜주면 된다. 데이터의 저장은 2차원 배열을 왼쪽 정렬하면 표현할 수 있으며, 아래 및 오른쪽 진행은 각각 행, 열이 증가하고 대각선 좌상 향은 행, 열이 모두 감소한다는 점을 조건으로 잘 사용하면 된다.

 

  또한 규칙을 찾으면서 발견할 수 있었던 점을 활용하였는데, n이 4일 때 반시계 방향으로 진행할 때 1~4까지 아래 방향으로 수행한 뒤, 5~7까지 오른쪽 방향으로 수행한 뒤, 8~9까지 좌상 향 대각선 방향으로 진행.. 과 같은 식으로 방향이 바뀔 때마다 수를 채우는 연산이 n-1씩 나타난다. 즉, n이 0이 되면 모든 과정을 마치고 모든 수를 채워야 한다. 이를 활용해 반복문을 작성한다.

 

import java.util.ArrayList;

class Solution {
    public ArrayList<Integer> solution(int n) {
        // 1. 정답을 담을 ArrayList.
        ArrayList<Integer> answer = new ArrayList<>();
        // 2. 수를 저장 할 2차원 배열.
        int[][] arr = new int[n][n];
        
        // 3. 증가하는 수 num, 행 row, 열 col.
        int num = 0, row =0, col=0;
        
        // 4. 아래, 오른쪽, 좌상향 대각선 방향을 구분하기 위한 flag.
        char flag = 'a';
        
        // 5. n!=0이면 아직 수를 다 채우지 못했다.
        while(n!=0){
            // 6. n, n-1, n-2... 순으로 수를 채우는 반복횟수가 줄어든다. 
            for(int i = 0 ;i<n;i++){
                switch(flag){
                    case 'a': // 아래 방향 진행
                        // 열인 col은 고정한 채 행인 row만 증가시킨다.
                        arr[row][col] = ++num;
                        row++;
                        break;
                    case 'b': // 오른쪽 방향 진행
                        // 행인 row를 고정한 채 열인 col만 증가시킨다.
                        arr[row][col] = ++num;
                        col++;
                        break;
                    case 'c': // 좌상향 대각선 방향 진행
                        // 행, 열 모두 1씩 감소해 대각선 방향으로 이동한다.
                        arr[row][col] =++num;
                        row--;
                        col--;
                        break;
                }
            }
            
            switch(flag){
                case 'a': // 아래쪽 방향 진행
                    // 다음 열부터 채우기 위해 col++, row는 반복문을 마치면서 n이 되므로 -1을 수행, flag 변경.
                    col++;
                    row--;
                    flag = 'b';
                    break;
                case 'b': // 오른쪽 방향 진행
                    // 좌상향 대각선의 시작위치를 위해 열은 -2, 행은 -1을 수행, flag 변경.
                    col-=2;
                    row--;
                    flag = 'c';
                    break;
                case 'c': // 좌상향 대각선 방향 진행.
                    // 마찬가지로 아래방향 진행 시작위치를 위해 행은 +2, 열은 +1을 수행, flag 변경.
                    row+=2;
                    col++;
                    flag = 'a';
                    break;                    
            }
            // 7. n의 크기를 감소.
            n--;
        }
        
        
        // 8. 행 순서대로 0이 아닌 경우만 ArrayList에 담아준다.
        for(int i =0;i<arr.length;i++){
            for(int j =0;j<arr[i].length;j++){
                if(arr[i][j] == 0) break;
                answer.add(arr[i][j]);
            }
        }
        
        return answer;
    }
}

 

반응형