2020-12-06
문제
홀수인 자연수 N(3≤N≤999)이 주어지면, 다음과 같이 1부터 N2까지의 자연수를 달팽이 모양으로 N*N의 표에 늘어놓을 수 있다.
N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.
입력
첫째 줄에 홀수인 자연수 N이 주어진다. 둘째 줄에는 위치를 찾고자 하는 N2 이하의 자연수가 하나 주어진다.
출력
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.
import java.util.Scanner;
public class TemplateA {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int size = scan.nextInt();
//크기를 담을 변수
int tsize = size;
//크기를 임시 저장할 변수
int n = scan.nextInt();
int max = size * size;
//배열에 들어갈 총숫자가 들어갈 변수
int [][] arr = new int[size][size];
int j = 0;
//열위치변수
int i = -1;
//행위치변수
int count = 1;
//행열에 더해줄 변수
while(true) {
for(int t = 1; t <= size; t++) {
i += count;
arr[i][j] = max;
max--;
//열고정 행변화 반복문
}
//처음에 행부터 하나씩 작아지면서 숫자를 너어줌
size--;
//열고정 행변화 반복문후 반복횟수 하나씩 적어짐
if(size <= 0) {break;}
//총사이즈가 0보다 작거나 같으면, 더이상 들어갈 자리가 없음
for(int t = 1; t <=size; t++) {
j += count;
arr[i][j] = max;
max--;
//행고정 열변화 반복문
}
count *= -1;
//한 루프가 다돌면 행열이 감소하거나 증가하는 순서가 바뀜
//때문에 더해주는 값을 1 또는 -1 로 변경해주어야함
}
int [] ans = new int [2];
for(int x = 0; x < tsize; x++) {
for(int y = 0; y < tsize; y++) {
if(n == arr[x][y]) {
ans[0] = x + 1;
ans[1] = y + 1;
//n의 값과 같은 위치를 저장하는 if 문
}
System.out.print(arr[x][y] + " ");
}
System.out.println();
}
System.out.println(ans[0] + " " + ans[1]);
}
}
출처링크: www.acmicpc.net/problem/1913