달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.
다음과 같이 정수 N을 입력 받아 N크기의 달팽이를 출력하시오.
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int Tc = Integer.parseInt(br.readLine());
//오,하,좌,상 순서로 방향배열 만들기
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
for (int tc = 1; tc <= Tc; tc++) {
int N = Integer.parseInt(br.readLine());
//N*N 크기의 2차원배열 생성
int arr[][] = new int[N][N];
boolean visit[][] = new boolean[N][N];
for (int i = 0; i < N; i++) {
Arrays.fill(visit[i], false);
}
//빈 칸을 다 채울때까지
int dir = 0;
int x = 0;
int y = 0;
for (int i = 1 ; i <= N*N; i++) {
//System.out.println(x + "," + y + " : "+ i);
//정수 입력 , 방향표시
arr[x][y] = i;
visit[x][y] = true;
//다음칸 갈수있는지 확인하기
int nextx = x + dx[dir];
int nexty = y + dy[dir];
//방향바꾸기 조건 : 1.범위를 넘어갈때 , 2. 다음칸이 채워져있을때
if(nextx >=N || nexty >=N || nextx < 0 || nexty < 0 || visit[nextx][nexty] == true ) {
dir = (dir+1)%4; //방향전환
}
//다음칸 지정
x = x + dx[dir];
y = y + dy[dir];
}
//출력하기
System.out.println("#" + tc );
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}//Tc
}
오른쪽->아래->왼쪽->위 순서로 2차원 배열을 쭉 채워나가면 되는문제였다.
dx,dy 한 쌍의 두배열을 설정하여, 배열인덱스에따라 좌표(x,y) 방향이 바뀔수있도록 의도하였다.
(0,1) -> (1,0) -> (0,-1) -> (-1,0) 순서로 dx,dy의 값이 변해야하는것이다.
이미 방문한 칸은 다시 방문하지않도록 visit라는 2차원 배열에 기록하였고, 다음칸이 배열의 범위를 벗어나거나 이미 방문한 칸이라면 방향을 바꿔주는 로직을 넣어주었다.