본문 바로가기

문제 풀이/Programmers

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

문제 출처 - Programmers

문제는 여기

 

코딩테스트 연습 - 삼각 달팽이

5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]

programmers.co.kr


[풀이]

1. 값을 입력시켜줄 2차원 배열을 생성한다.

2. 숫자가 적히는 방법은 총 3가지이다.

2-1. 아래 방향

2-2. 오른쪽 방향

2-3. 위 방향

3. 2. 에서 숫자가 적히기 위한 방법은 아래와 같다.

3-1. 행 증가

3-2. 열 증가

3-3. 행, 열 감소

4. 방향을 바꾸는 횟수는 n과 일치하기 때문에 n만큼 반복을 한다.

5. 조건에 맞춰 아래, 왼쪽, 위 3가지 방향으로 바꿔주고, 값을 올려가며 숫자를 넣어준다.

6. 입력된 숫자를 정답에 넣고 출력한다.

[접근]

1. 방향이 한번 바뀔 때마다 칸의 수가 1개씩 줄어드는 규칙을 알게 되었다.

2. 마지막에 나오는 숫자는 (n * (n + 1)) / 2라는 규칙을 알게 되었다.

[코드]

class Solution {
    public int[] solution(int n) {
        int num = 1;
        int a = -1;
        int b = 0;
        int[][] map = new int[n][n];

        // n의 갯수 == 꺾는 횟수
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                // 아래
                if (i % 3 == 0) {
                    a++;
                }
                // 왼쪽
                else if (i % 3 == 1) {
                    b++;
                }
                // 위
                else if (i % 3 == 2) {
                    a--;
                    b--;
                }
                
                map[a][b] = num;
                num += 1;
            }
        }
        
        int k = 0;
        // n * (n + 1) / 2가 제일 마지막 숫자
        int[] answer = new int[(n * (n + 1)) / 2];
        
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                // 0이면 삼각형의 모양을 벗어난 곳
                if(map[i][j] == 0)
                	break;
                
                answer[k++] = map[i][j];
            }
        }

        return answer;
    }
}