티스토리 뷰
https://www.acmicpc.net/problem/1913
1913번: 달팽이
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서
www.acmicpc.net
문제
접근 방법
달팽이가 움직이는 모습은 위와 같다.
시작점을 먼저 찾고 ( N/2, N/2 )
시작점을 기준으로 움직일 수 있는 범위를 제한하여 구동하면 된다.
예를 들어 1->2, 2->3을 갈때는 최대 한 칸만 움직일 수 있지만
3->5, 7->10 등 움직일 수 있는 범위가 늘어나는 포인트가 생긴다.
이 포인트들은 달팽이가 위, 아래로 움직일 때 (x,y에서 x값이 증가하거나 감소할 때) 이다.
즉, 이 포인트들 전 범위를 증가시키고 상 -> 우 -> 하 -> 좌 를 반복하면 0,0 위치까지 도달할 수 있다.
코드
import java.io.*;
import java.util.*;
class Main {
private static int N;
private static int[][] matrix;
static int[] mx = {0, 1, 0, -1};
static int[] my = {1, 0, -1, 0};
static void fillMatrix() {
int tmp = 0;
int x = N/2;
int y = N/2; // 1이 위치할 좌표
int range = 1;
matrix[x][y] = tmp++;
while(true) {
for(int i=0; i<range; i++) {
matrix[x--][y] = tmp++;
} //상
if(tmp-1 == N*N) break;
for(int i=0; i<range; i++) {
matrix[x][y++] = tmp++;
} //우
range++; // 하로 가기 전 범위 증가
for(int i=0; i<range; i++) {
matrix[x++][y] = tmp++;
} //하
for(int i=0; i<range; i++) {
matrix[x][y--] = tmp++;
} //좌
range++; /상 하기 전 범위 증가
}
}
static String printMatrix() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sb.append(matrix[i][j]).append(" ");
}
sb.append("\n");
}
return sb.toString();
}
static String findCoordinate(int findNumber) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(matrix[i][j] == findNumber) {
sb.append(i+1).append(" ").append(j+1);
}
}
}
return sb.toString();
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
int findNumber = Integer.parseInt(br.readLine());
matrix = new int[N][N];
fillMatrix();
System.out.print(printMatrix());
System.out.print(findCoordinate(findNumber));;
}
}