[달팽이 배열 - Medium]

< 문제 >

  • 개요
    [달팽이 로직]
    5*5 2차원 배열안에 양수를 달팽이 모양으로 차례로 채웁니다.

  • 예상 결과
    예상 결과는 하기 코드 실행시 예상되는 결과 값이다.

   1	 2	 3	 4	5
   16	17	18	19	6
   15	24	25	20	7
   14	23	22	21	8
   13	12	11	10	9

< 정답풀이 >

 public class Test06 {

	public static void main( String[] args ) {
		// 시작시간 기록
		long startTime = System.currentTimeMillis();

		int size = 5; // 배열의 크기
		process( size );

		// 종료시간 기록
		long endTime = System.currentTimeMillis() - startTime;
		System.out.println( "소요시간 : " + endTime + "ms." );
	}

	/**
	 * 
	 * <PRE>
	 * 달팽이형태로 2차원 배열 채우기
	 * </PRE>
	 */
	public static void process( int size ) {
		int num = 1;       // 배열안에 저장될 값(1부터 시작)
		int offset = 1;    // 저장의 방향(1: 양, -1: 음)
		int i = 0, j = -1; // 배열 Index(i, j)
		int[][] matrix = new int[size][size]; // 2차원 배열

		while ( size > 0 ) {

			// STEP 1. 가로열 채우기(Offset 만큼 이동하면서 num++를 채움)
			for ( int inx = 0 ; inx < size ; inx++ ) {
				j += offset;
				matrix[i][j] = num++;
			}

			// STEP 1-1. 가로열에서 세로열로 변경시 채워야할 칸이 한칸 씩 줄어든다.
			size--;

			// STEP 2. 세로열 채우기(Offset 만큼 이동하면서 num++를 채움)
			for ( int inx = 0 ; inx < size ; inx++ ) {
				i += offset;
				matrix[i][j] = num++;
			}

			// STEP 3. 가로열과 세로열을 모두 채우면 방향을 바꾼다.
			offset = -offset;
		}

		// STEP 4. 저장한 결과를 출력한다.
		printArray( matrix );
	}

	/**
	 * 
	 * <PRE>
	 * 배열을 출력한다.
	 * </PRE>
	 * 
	 * @param arr 배열
	 */
	public static void printArray( int[][] arr ) {
		int size = arr.length;
		for ( int row = 0 ; row < size ; row++ ) {
			for ( int col = 0 ; col < size ; col++ ) {
				System.out.printf( "%3d", arr[row][col] );
			}
			System.out.println();
		}
		System.out.println();
	}
}