1. 문제
2. 풀이
1) 첫 번째 풀이
public int[] solution1(int n) {
int max_num = n * (n + 1) / 2;
int[] answer = new int[max_num];
int[][] triangle = new int[n][n];
int x = 0;
int y = 0;
int num = 1;
int v = n;
while (v > 0) {
// 아래로 이동
for (int i = 0; i < v; i++) {
triangle[y++][x] = num;
num++;
}
y--; // index 범위 벗어남 다시 제자리로
x++; // 다음 위치로 이동
v--;
for (int i = 0; i < v; i++) {
triangle[y][x++] = num;
num++;
}
x--; // index 범위 벗어남 다시 제자리로
x--;
y--; // 다음 위치로 이동
v--;
for (int i = 0; i < v; i++) {
triangle[y--][x--] = num;
num++;
}
x++;
y++; // index 범위 벗어남 다시 제자리로
y++; // 다음 위치로 이동
v--;
}
int index = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
answer[index++] = triangle[i][j];
}
}
return answer;
}
처음 생각한 풀이이다.
우선 달팽이를 채우는 순서는 1. 아래방향으로 이동 2. 오른쪽으로 이동 3. 대각선 위로 이동이고 이것을 총 n번 실행하게 되며
또한 처음 아래방향으로 이동할 땐 n번 아래로 이동, 그다음 오른쪽으로 이동할 땐 n-1번, 그다음 대각선으로 이동할 땐 n-2 번 이동하게 되어 n(v)이 0보다 작아질 때까지 반복문을 이용하여 이동하게 해 주었다.
2) dx, dy를 이용한 두 번째 풀이
private static final int[] dx = {0, 1, -1};
private static final int[] dy = {1, 0 , -1};
public int[] solution2(int n) {
int[][] triangle = new int[n][n];
int v = 1;
int x = 0;
int y = 0;
int d = 0;
while(true){
triangle[y][x] = v++;
int nx = x + dx[d];
int ny = y + dy[d];
if(nx == n || ny == n || nx == -1 || ny == -1 || triangle[ny][nx] != 0){
d = (d + 1) % 3;
nx = x + dx[d];
ny = y + dy[d];
if(nx == n || ny == n || nx == -1 || ny == -1 || triangle[ny][nx] != 0) break;
}
x = nx;
y = ny;
}
int[] result = new int[v - 1];
int index = 0;
for(int i = 0 ; i < n; i++){
for(int j = 0; j <= i; j++){
result[index++] = triangle[i][j];
}
}
return result;
}
구현을 더 간단하고 쉽게 하기 위해 dx, dy로 방향을 설정해 주었다. 이로써 디버깅을 쉽게 할 수 있게 하고 구현방법을 바꾸어야 할 때 다량의 코드를 수정할 필요 없게 되고 직관적으로 문제를 풀 수 있었다.
'개발 공부 > 알고리즘' 카테고리의 다른 글
자주 사용되는 정규 표현식, [프로그래머스] 신규 아이디 추천 (0) | 2024.03.28 |
---|---|
[프로그래머스] 가장 가까운 글자 (0) | 2023.12.05 |
프로그래머스 - 교점에 별 만들기 (4) | 2023.11.02 |