코딩 테스트(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를