달팽이가 이동하는 패턴은 안쪽부터 위로 1칸, 오른쪽으로 1칸, 밑으로 2칸, 왼쪽으로 2칸, 위로 3칸, 오른쪽으로 3칸과 같이 상 -> 우 -> 하 -> 좌 로 이동한다는 것을 알 수 있다.
또한 방향을 2번 전환할때마다 이동하는 최대거리가 1씩 증가하는 것을 확인할 수 있다.
위로 1칸 오른쪽으로 1칸 밑으로 2칸 왼쪽으로 2칸
위로 3칸 오른쪽으로 3칸 밑으로 4칸 왼쪽으로 4칸
이런 식...
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
*
* 상 -> 우 -> 하 -> 좌
상 :
우 :
하 : 상, 우 보다 1번 더 많음
좌 : 상, 우보다 1번 더 많음
즉 두 번 방향을 전환할 때마다 이동하는
최대거리가 1씩 증가한다
int next : 이동하려는 방향과 관련
int count : 같은 방향으로 이동할 때 횟수
int max : 최대 이동 횟수
int ls : 방향 전환 횟수
for ( int i = 1 ~ n^n )
배열에 숫자 표시
현재 방향으로 한 칸 이동
이 때 현재 위치 + dx[next % 4]
next는 계속 증가하므로 4씩 나눠준 나머지로 생각
같은 방향 이동 횟수++
방향 전환 (최대 이동 횟수만큼 그 방향으로 이동했다면)
if(count == max)
next++
count = 0 // 같은 방향 이동횟수 초기화
ls++ // 방향 전환 횟수
//방향 전환 2번 될 때마다('하'로 바뀔때마다) 최대이동횟수++
-> 하, 좌로 이동할 때는 상, 우보다 + 1만큼 이동할 수 있기 때문
if(ls == 2)
max++
ls = 0; // 방향 전환 횟수 0으로 초기화
*/
public class Main {
static int[] dx = {-1, 0, 1, 0};
static int[] dy = {0, 1, 0, -1};
static int N;
static int X;
static int[][] arr;
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
X = Integer.parseInt(br.readLine());
arr = new int[N][N];
int ansRow = 0;
int ansCol= 0; // 정답 행, 열
StringBuilder sb = new StringBuilder();
solution();
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
sb.append(arr[i][j] + " ");
if(arr[i][j] == X) {
ansRow = i+1;
ansCol = j+1;
}
}
sb.append("\n");
}
sb.append(ansRow + " " + ansCol);
System.out.println(sb);
}
public static void solution() {
int row = N/2;
int col = N/2; // 시작 좌표
int next = 0; // 방향 이동
int count = 0; // 같은 방향 이동 횟수
int max = 1; // 초기 최대 이동 가능 횟수
int ls = 0; // 방향 전환 횟수
for(int i=1; i<=N*N; i++) {
arr[row][col] = i;
// 방향 이동
row += dx[next % 4];
col += dy[next % 4];
count++; // 방향 횟수 + 1
if(count == max) {
// 최대 이동 횟수에 걸린다면
count = 0;
next++; // 그 다음 방향
ls++; // 방향 전환이 2번 되면 '하'로 감
}
if(ls == 2) {
// '하'로 가야할 때
max++;
ls = 0;
}
}
}
}