문제
홀수인 자연수 N이 주어지면, 다음과 같이 1부터 N2까지의 자연수를 달팽이 모양으로 N×N의 표에 채울 수 있다.
9 | 2 | 3 |
8 | 1 | 4 |
7 | 6 | 5 |
25 | 10 | 11 | 12 | 13 |
24 | 9 | 2 | 3 | 14 |
23 | 8 | 1 | 4 | 15 |
22 | 7 | 6 | 5 | 16 |
21 | 20 | 19 | 18 | 17 |
N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.
입력
첫째 줄에 홀수인 자연수 N(3 ≤ N ≤ 999)이 주어진다. 둘째 줄에는 위치를 찾고자 하는 N2 이하의 자연수가 하나 주어진다.
출력
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.
나의 풀이
방향을 위 → 오른쪽 → 아래 → 왼쪽 순서로 움직이며 숫자를 채웁니다.
나의 코드
import java.io.*;
/**
* 백준 1913 - 달팽이 (실버 3)
* https://www.acmicpc.net/problem/1913
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int t = Integer.parseInt(br.readLine());
int[][] map = new int[n][n];
int value = 1;
int row = n / 2, col = n / 2;
int limit = 1;
// 방향별 이동: 상, 우, 하, 좌
while (value <= n * n) {
// 상
for (int i = 0; i < limit && value <= n * n; i++) {
map[row--][col] = value++;
}
// 우
for (int i = 0; i < limit && value <= n * n; i++) {
map[row][col++] = value++;
}
limit++;
// 하
for (int i = 0; i < limit && value <= n * n; i++) {
map[row++][col] = value++;
}
// 좌
for (int i = 0; i < limit && value <= n * n; i++) {
map[row][col--] = value++;
}
limit++;
}
StringBuilder sb = new StringBuilder();
int tx = 0, ty = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
sb.append(map[i][j]);
if (j < n - 1) sb.append(" ");
if (map[i][j] == t) {
ty = i + 1;
tx = j + 1;
}
}
sb.append("\n");
}
sb.append(ty).append(" ").append(tx);
System.out.print(sb);
}
}