문제풀이

[SW Academy] 1954 달팽이 숫자 - JAVA

자르비옹스 2022. 2. 4. 15:09

재귀를 이용하여 겉과 속을 나누어 배열에 저장하였다.

재귀를 사용할 때는 n이 -2씩 줄어들기 때문에 마지막에 n이 1인 경우와 0인 경우로 나뉜다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Solution {

	public static void main(String[] args) throws NumberFormatException, IOException {
		 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		 int T = Integer.parseInt(br.readLine());
		 for (int i = 1; i <= T; i++) {
			 StringBuilder sb = new StringBuilder();
			 int N = Integer.parseInt(br.readLine());
			 int[][] arr = new int[N][N];
			sb.append("#").append(i).append('\n');
			solution(arr, 0, 0, 1, N);
			for (int j = 0; j < arr.length; j++) {
				for (int j2 = 0; j2 < arr.length; j2++) {
					sb.append(arr[j][j2]).append(" ");
				}
				sb.append("\n");
			}
			sb.setLength(sb.length()-1);
			System.out.println(sb.toString());
		}
	}
	
	public static void solution(int[][] arr, int row, int col, int startNum, int n) {
		if(n == 1) {
			arr[row][col] = startNum;
			return;
		}else if(n == 0) {
			return;
		}
		
		// 상
		for (int i = col; i < col+n; i++) {
			arr[row][i] = startNum++;
		}
		
		// 우
		for(int i=row+1; i<row+n; i++) {
			arr[i][col+n-1] = startNum++;
		}
		
		// 하
		for(int i=col+n-2;i>=col; i--) {
			arr[row+n-1][i] = startNum++;
		}
		
		// 좌
		for(int i=row+n-2; i>row; i--) {
			arr[i][col] = startNum++;
		}
		
		solution(arr, row+1, col+1, startNum, n-2);
		
	}

}