백준 BaekJoon 1913번: 달팽이 [Java] 자바

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

 

1913번: 달팽이

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서

www.acmicpc.net