https://www.acmicpc.net/problem/1913
3
1
9 2 3
8 1 4
7 6 5
2 2
위의 반례를 찾지 못해서 시간이 많이 소요되었다. 위의 반례의 경우에는 while문이 돌기 전의 조건(arr[rowStart][colStart] = num++;의 조건)이므로 내가 따로 지정을 해 주어야 한다.
package silver3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class num1913 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int inputNum = Integer.parseInt(br.readLine());
int num = 1; // 시작 수
int[][] arr = new int[N][N];
int x = 0;
int y = 0;
int rowStart = N / 2;
int colStart = N / 2;
arr[rowStart][colStart] = num++;
if (arr[rowStart][colStart] == inputNum) {
x = N / 2;
y = N / 2;
}
int steps = 1; // 나선의 초기 크기
while (num <= N * N) {
for (int i = 0; i < steps; i++) {
if (num > N * N) {
break;
}
rowStart--; //위로
arr[rowStart][colStart] = num++;
if (arr[rowStart][colStart] == inputNum) {
x = rowStart;
y = colStart;
}
}
for (int i = 0; i < steps; i++) {
if (num > N * N) {
break;
}
colStart++; //오른쪽으로
arr[rowStart][colStart] = num++;
if (arr[rowStart][colStart] == inputNum) {
x = rowStart;
y = colStart;
}
}
steps++;
for (int i = 0; i < steps; i++) {
if (num > N * N) {
break;
}
rowStart++; //아래로
arr[rowStart][colStart] = num++;
if (arr[rowStart][colStart] == inputNum) {
x = rowStart;
y = colStart;
}
}
for (int i = 0; i < steps; i++) {
if (num > N * N) {
break;
}
colStart--; //왼쪽으로
arr[rowStart][colStart] = num++;
if (arr[rowStart][colStart] == inputNum) {
x = rowStart;
y = colStart;
}
}
steps++;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
System.out.println((x + 1) + " " + (y + 1));
}
}