코딩 테스트(Coding Test)/프로그래머스

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

배씌 2024. 11. 20. 16:30

https://school.programmers.co.kr/learn/courses/30/lessons/68645?language=java

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


1. 아이디어

삼각형을 2차원 배열로 생각하면 된다.

 

<문제 풀이 흐름>

1. n x n 2차원 배열 선언

2. 숫자를 채울 현재 위치를 (0, 0)으로 설정

3. 방향에 따라 이동할 수 없을 때까지 반복하면서 숫자 채우기

  A. 아래로 이동하면서 숫자 채우기

  B. 오른쪽으로 이동하면서 숫자 채우기

  C. 왼쪽 위로 이동하면서 숫자 채우기

4. 채워진 숫자를 1차원 배열로 변환 후 반환

 

2. 코드 작성

1. n x n 2차원 배열 선언

int[][] triangle = new int[n][n];
int v = 1;

 

2. 숫자를 채울 현재 위치를 (0, 0)으로 설정

int x = 0;
int y = 0;

 

3. 방향에 따라 이동할 수 없을 때까지 반복하면서 숫자 채우기

while (true) {
    // 아래로 이동

    // 오른쪽으로 이동
    
    // 왼쪽 위로 이동
    
}

 

3-A. 아래로 이동하면서 숫자 채우기

// 아래로 이동
while (true) {
    triangle[y][x] = v++;
    if (y + 1 == n || triangle[y + 1][x] != 0) break;
    y++;
}
if (x + 1 == n || triangle[y][x + 1] != 0) break;
x++;

 

다음 스텝인 오른쪽으로 이동해야 하지만, 이동할 수 없을 수도 있음. -> if문으로 오른쪽으로 못가는 상황일때는 반복 탈출

 

3-B. 오른쪽으로 이동하면서 숫자 채우기

// 오른쪽으로 이동
while (true) {
    triangle[y][x] = v++;
    if (x + 1 == n || triangle[y][x + 1] != 0) break;
    x++;
}
if (triangle[y - 1][x - 1] != 0) break;
x--;
y--;

마찬가지로 왼쪽 위(왼쪽 대각선) 방향으로 이동 못하는 경우 반복 탈출

 

3-C. 왼쪽 위로 이동하면서 숫자 채우기

// 왼쪽 위로 이동
while (true) {
    triangle[y][x] = v++;
    if (triangle[y - 1][x - 1] != 0) break;
    x--;
    y--;
}
if (y + 1 == n || triangle[y + 1][x] != 0) break;
y++;

3-A, 3-B 와 동일

 

4. 1차원 배열로 변환 후 반환

int index = 0;
int[] answer = new int[v-1];
for(int i=0; i<n; i++) {
    for(int j=0; j<=i; j++) {
        answer[index++] = triangle[i][j];
    }
}
return answer;

 

더 나은 코드

2차원 배열에서는 방향을 이용하는 문제가 많다. dx, dy를