
●문제 출처
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq
●정리(요약)
달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.
N크기의 달팽이를 출력
1 2 3
8 9 4
7 6 5
0,0 -> 0,1 -> 0,2 -> 1,2 -> 2,2 -> 1,2 -> 0,2 -> 0,1 -> 1,1
순으로 만들어 진다.
●코드1
import java.util.Scanner;
class Solution
{
static int [][] arr;
static boolean [][] visited;
public static void main(String args[]) throws Exception
{
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int T = sc.nextInt();
for(int i = 0; i<T ; i++) {
int N = sc.nextInt();
arr = new int[N][N];
visited = new boolean[N][N];
clockSort(0,0,1,1);
sb.append("#").append(i+1).append("\n");
for(int j=0; j<N; j++) {
for(int k=0; k<N; k++) {
sb.append(arr[j][k]+" ");
}
sb.append("\n");
}
}
System.out.println(sb.toString());
}
public static void clockSort(int x, int y,int count ,int as) {
if (count > arr.length * arr.length) {
return;
}
switch (as) {
case 1:
while(arr.length>x&& !visited[y][x]) {
arr[y][x]=count++;
visited[y][x]=true;
x++;
}
clockSort(x-1,y+1,count,as+1);
break;
case 2:
while(arr.length>y&& !visited[y][x]) {
arr[y][x]=count++;
visited[y][x]=true;
y++;
}
clockSort(x-1,y-1,count,as+1);
break;
case 3:
while(0<=x&& !visited[y][x]) {
arr[y][x]=count++;
visited[y][x]=true;
x--;
}
clockSort(x+1,y-1,count,as+1);
break;
case 4:
while(y >= 0&&!visited[y][x]) {
arr[y][x]=count++;
visited[y][x]=true;
y--;
}
clockSort(x+1,y+1,count,1);
break;
}
}
}
● 코드2
import java.util.Scanner;
class Solution
{
static int [] dx = {1,0,-1,0};
static int [] dy = {0,1,0,-1};
public static void main(String args[]) throws Exception{
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int T = sc.nextInt();
for(int i =0 ; i<T; i++) {
int N = sc.nextInt();
int [][] arr = new int[N][N];
int hx = 0;
int hy = 0;
int d =0;
for(int j=0; j<N*N;j++) {
arr[hy][hx]=j+1;
if(hx+dx[d]>=arr.length|| hy+dy[d]>=arr.length ||hy+dy[d]<0 || hx+dx[d]<0 || arr[hy+ dy[d]][hx+dx[d]]!=0) {
d++;
if(d>3) {
d=0;
}
}
hx = hx+ dx[d];
hy = hy+ dy[d];
}
sb.append("#").append(i+1).append("\n");
for(int j=0; j<N; j++) {
for(int k=0; k<N; k++) {
sb.append(arr[j][k]+" ");
}
sb.append("\n");
}
}
System.out.println(sb.toString());
}
}
●느낀 점
1번은 clockSort 메소드를 이용하여 재귀적으로 호출되어 4개의 방향(오른쪽, 아래, 왼쪽, 위쪽)으로 이동하면서 배열을 채우도록 하였다.
2번은 dx dy 를 이용하여 방향 배열 설정하였고 배열의 경계에 도달하거나 이미 숫자가 있는 위치에 도달하면 방향을 바꾸도록하였다.
1번을 푸는중에 더 간단하게 풀 수 있을 거 같아 2번 처럼 풀어보았다ㅎㅎ...