h-i-s-t-o-r-y

[Java] 마방진(Magic Square) 본문

Java

[Java] 마방진(Magic Square)

H' 2021. 7. 16. 12:01
package days14;

import java.util.Random;

public class Ex01 {

	public static void main(String[] args) {
		final int SIZE = 5;
		int [][] m = new int[SIZE][SIZE];
		
							//1~25
//		fillM01(m);			//순서대로 번호 채워넣기
//		fillShuffle02(m);	//랜덤으로 번호 채워넣기
		
							//25~1
//		fillM02_01(m);		//첫방부터 채워넣기
//		fillM02_02(m);		//끝방부터 채워넣기, 방을 찾아서 채워넣기
		
//		fillM03(m);			//지그재그 채워넣기
		
		//마방진 - 짝수마방진, 홀수마방진(5*5)
		magicSquare(m);
		
		dispM(m);
		
		
	}//main
	
	
	
	private static void magicSquare(int[][] m) {
		// 0행에 가운데 열에 1 (02)
		// 규칙 - 5의배수라면 행만증가    아니라면 열증가 행감소
		// 행 마이너스 벗어나면 가장 큰 행으로 이동 -1 -> 4행
		// 열 큰범위 벗어나면 가장 작은 열로 이동 5 -> 0열
		
		int n = 1;
		int row = 0, col = m.length/2;
		while (n <= 25) {
			m[row][col] = n;
			dispM(m);
			if (n%5==0) {
				row++;
			} else {
				col++; row--;
				if (col==5) col = 0;
				if (row==-1) row = 4;
			}
			n++;
		}//while
		
		
		/*
		int i = 0;
		int j = 2;
		m[0][2] = 1;
		int num = 1;
		
		while (num < 25) {			
			if (num%5 == 0) i++;
			else {
				i--; j++;
//				i = i>-1? i: i+5;
//				j = j<5? j: j-5;
			}
			m[i][j] = ++num;
		}//while
		*/
		
	}//magicSquare



	private static void fillM03(int[][] m) {
		/*
		int n = 1;
		boolean sw = false;
		for (int i = 0; i < m.length; i++) {
			if(!sw) {
				for (int j = 0; j < m[i].length; j++) {
					m[i][j] = n++;
				}
			}//if
			else {
				for (int j = m[i].length-1; j >=0; j--) {
					m[i][j] = n++;
				}
			}//else
			sw=!sw;
		}//for
		*/
		
		// 행의 짝홀에 따라 값을 변화시켜서 저장
		/*
		for (int i = 0; i < m.length; i++) {
			for (int j = 0; j < m[i].length; j++) {
				m[i][j] = (i%2==0)? 5*i+j+1: 5*(i+1)-j;
				
			}
		}
		*/
		
		// 방의 위치를 변화시킴
		for (int i = 0; i < m.length; i++) {
			for (int j = 0; j < m[i].length; j++) {
//				if (i%2==0) m[i][j] = 5*i+j+1;
//				else m[i][4-j] = 5*i+j+1;
				m[i][ (i%2==0)? j: 4-j ] = 5*i+j+1;
			}
		}
		
	}


	private static void fillM02_02(int[][] m) {
		/* 끝방에서부터
		int n = 1;
		for (int i = m.length-1; i >=0; i--) {
			for (int j = m[i].length-1; j >=0; j--) {
				m[i][j] = n++;
			}
		}
		*/
		
		// 원하는 위치의 방을 찾아서 채워넣기
		int n = 25;
		for (int i = 0; i < m.length; i++) {
			for (int j = 0; j < m[i].length; j++) {
				m[4-i][4-j] = 5*i+j+1;
			}
		}
		
	}//fillM02_02


	private static void fillM02_01(int[][] m) {
		/*
		int n = 25;
		for (int i = 0; i < m.length; i++) {
			for (int j = 0; j < m[i].length; j++) {
				m[i][j] = n--;
			}
		}
		*/
		for (int i = 0; i < m.length; i++) {
			for (int j = 0; j < m[i].length; j++) {
//				m[i][j] = 25 - (5*i+j);
//				m[i][j] = 5*(5-i) - j;
				
			}
		}
	}//fillM02_01

	private static void fillShuffle02(int[][] m) {
		Random rnd = new Random();
		int n = 1;
		int row, col;
		while (n <= 25) {
			row = rnd.nextInt(5);
			col = rnd.nextInt(5);
			if ( m[row][col] == 0 ) {	//아직 채워지지 않았는지 여부 체크
				m[row][col] = n++;
			}
		}
		
	}
	
	private static void fillM01(int[][] m) {
		for (int i = 0; i < m.length; i++) {
			for (int j = 0; j < m[i].length; j++) {
				//		열개수 *i
				m[i][j] = 5*i + j + 1;
			}
		}
	}

	
	private static void dispM(int[][] m) {
		System.out.println();
		System.out.println();
		System.out.println();
		System.out.println();
		System.out.println();
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//출력
		for (int i = 0; i < m.length; i++) {
			for (int j = 0; j < m[i].length; j++) {
				System.out.printf("[%02d]", m[i][j]);
			}
			System.out.println();
		}
	}

}//class
Comments