PCCP/프로그래머스

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

Life Log 2025. 4. 28. 01:16
728x90
반응형

문제 링크 바로가기


1. 문제 핵심 요약

주어진 정수 n에 대해,

  • 밑변과 높이가 n인 삼각형을 생각하고,
  • 맨 위 꼭짓점부터 반시계 방향으로 달팽이처럼 숫자를 채워나가야 합니다.
  • 채운 결과를 첫 번째 행부터 순서대로 한 줄 배열로 합친 결과를 구하는 문제입니다.

예시

n 값 결과 배열
4 [1,2,9,3,10,8,4,5,6,7]
5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9]

2. 주의사항

  • n은 최대 1000까지 주어질 수 있습니다. (n=1000이면 최대 1,000,000개의 숫자)
  • 삼각형 형태로 채워야 하므로 (i, j)에서 j <= i인 영역만 사용해야 합니다.
  • 방향 전환3단계(아래→오른쪽→대각선 위 왼쪽)를 순서대로 반복합니다.
  • 초기 위치 설정을 조심해야 합니다: (0,0)부터가 아니라 (y=-1, x=0)에서 시작해야 합니다.
  • 배열의 크기n x n이지만 실제로는 삼각형 부분만 사용합니다. (0이 남아있을 수 있음)

3. 슈도코드

1. n x n 크기의 2차원 배열 result를 초기화한다.
2. 방향 이동을 위한 delta 배열 (dy, dx)을 준비한다.
   - 아래로 이동: (dy=1, dx=0)
   - 오른쪽으로 이동: (dy=0, dx=1)
   - 대각선 위 왼쪽 이동: (dy=-1, dx=-1)
3. 시작 좌표를 (y=-1, x=0)으로 설정한다.
4. 이동할 길이 len을 n부터 1까지 감소시키며:
    - 현재 방향(dir)로 len번 이동하면서 숫자(cnt)를 채워넣는다.
    - 이동 후 dir = (dir + 1) % 3로 방향을 전환한다.
5. 2차원 배열 result를 순회하며 삼각형 영역에 있는 숫자들을 차례로 1차원 배열에 담는다.
6. 완성된 배열을 반환한다.

4. 코드 (자세한 주석 포함)

import java.util.*;

class Solution {
    public int[] solution(int n) {
        int[][] result = new int[n][n]; // 결과를 저장할 n x n 배열
        int cnt = 0; // 채워넣을 숫자

        // delta 배열: 방향 이동을 (y,x) 변화량으로 정의
        int[] dy = {1, 0, -1}; // 아래 → 오른쪽 → 대각선 위 왼쪽
        int[] dx = {0, 1, -1};

        int y = -1; // 시작 위치 (y = -1, x = 0) 설정
        int x = 0;
        int dir = 0; // 현재 방향 (0: 아래, 1: 오른쪽, 2: 대각선 위 왼쪽)

        // len은 이동해야 할 거리, n부터 1까지 감소
        for (int len = n; len > 0; len--) {
            for (int i = 0; i < len; i++) {
                y += dy[dir]; // 방향에 따라 y 좌표 이동
                x += dx[dir]; // 방향에 따라 x 좌표 이동
                result[y][x] = ++cnt; // 현재 좌표에 숫자 채워넣기
            }
            dir = (dir + 1) % 3; // 방향을 반시계 방향으로 전환 (0→1→2→0 반복)
        }

        // 최종 결과를 저장할 배열
        int[] answer = new int[cnt];
        int index = 0;

        // result 배열에서 삼각형 영역만 추출
        for (int i = 0; i < n; i++) {
            for (int j = 0; j <= i; j++) { // 삼각형 영역은 j <= i
                answer[index++] = result[i][j];
            }
        }

        return answer;
    }
}

✨ 주의 깊게 봐야 할 주석 포인트

  • delta 배열 사용해서 방향 전환을 깔끔히 관리했습니다.
  • y=-1부터 시작하는 이유는 첫 번째 이동이 y+1이기 때문입니다.
  • result 배열에서 (i,j)j <= i까지만 유효합니다.
  • 방향은 (0: 아래) → (1: 오른쪽) → (2: 대각선 위 왼쪽) 순서로 반복합니다.

🔥 마무리

이 문제는 단순 구현이지만,

  • 방향 제어,
  • 삼각형 영역 추출,
  • 배열 인덱스 관리

이 세 가지를 모두 신경써야 하므로 꼼꼼함이 중요합니다.

delta 배열을 잘 활용하면, 방향 전환을 쉽게 처리할 수 있어서 코드가 훨씬 깔끔해집니다!

728x90
반응형

'PCCP > 프로그래머스' 카테고리의 다른 글

[프로그래머스 JAVA] 교점에 별 만들기  (0) 2025.04.27