달팽이 숫자
- 달팽이 집은 이차원 배열 빈공간으로 주어진다.
- 달팽이 집의 각 칸을 방문하며 숫자를 넣어준다.
- 달팽이 집 이동은 오른쪽 -> 아래 -> 왼쪽 -> 위 순서이다.
- 방향을 바꾸는 법칙은 배열의 끝에 도달하거나, 이미 숫자가 채워진 칸이면 방향을 바꾸도록 한다.
- 오른쪽: 열에 1을 더한다
- 아래: 행에 1을 더한다
- 왼쪽: 열에 1일 뺀다
- 위: 행에 1을 뺀다
내가 작성한 코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};
int[][] snail;
for(int i=0; i<T; i++) {
int N = Integer.parseInt(br.readLine());
snail = new int[N][N];
int cur = 1;
int row = 0;
int col = 0;
int dir = 0;
for(int j=0; j< N*N; j++) {
snail[row][col] = cur;
cur++;
int nrow = row + dx[dir];
int ncol = col + dy[dir];
if(nrow < 0 || nrow >= N || ncol < 0 || ncol >= N || snail[nrow][ncol] != 0) {
dir = (dir+1)%4;
nrow = row + dx[dir];
ncol = col + dy[dir];
}
row = nrow;
col = ncol;
}
sb.append("#").append(i+1).append("\n");
for(int o=0; o<N; o++) {
for(int p=0; p<N; p++) {
sb.append(snail[o][p]).append(" ");
}
sb.append("\n");
}
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
정답 코드
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int[][] snail;
int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};
int T = Integer.parseInt(br.readLine());
for(int i=0; i<T; i++) {
int n = Integer.parseInt(br.readLine());
snail = new int[n][n];
int x = 0;
int y = 0;
int dir = 0;
for(int cur=1; cur <= n*n; cur++) {
snail[x][y] = cur;
int nx = x + dx[dir];
int ny = y + dy[dir];
if(nx < 0 || nx >= n || ny < 0 || ny >= n || snail[nx][ny] != 0) {
dir = (dir + 1) % 4;
nx = x + dx[dir];
ny = y + dy[dir];
}
x = nx;
y = ny;
}
sb.append("#").append(i+1).append("\n");
for(int sx=0; sx<n; sx++) {
for(int sy=0; sy<n; sy++) {
sb.append(snail[sx][sy]).append(" ");
}
sb.append("\n");
}
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}