본문 바로가기

프로그래밍/자바(JAVA)

[자바/JAVA] 자바로 만든 마방진 코드(홀수, 4의 배수)

자바로 만든 마방진 코드(홀수, 4의 배수)


모두 동일한 클래스(MagicSquare.java) 파일안에 넣으셔야 합니다.

배경이 분리 되어 있으니 하나의 클래스에 존재하는 메소드들 입니다.

import java.io.*;

class MagicSquare
{
 static int length; // 마방진의 행,열 길이를 잡을 int

 // 4의 배수 마방진을 만드는 메서드입니다.
 public static void fourSome(int fSL) // fSL은 fourSomeLength의 이니셜
 {
  System.out.println(fSL);
  int fourMS[][] = new int[fSL][fSL]; // 4의 배수 다항 배열
  
  int i=0, j=0, k=1, m=fSL*fSL; // k는 정방향으로 1씩 늘어나고 m은 역방향으로 1씩 늘어날 겁니다.

  for(i=0; i<fSL; i++)
  {
   for(j=0; j<fSL; j++)
   {
    if((fSL/4>i && fSL/4>j) || (fSL/4>i && fSL*3/4<=j) || (fSL*3/4<=i && fSL/4>j) || (fSL*3/4<=i && fSL*3/4<=j) || (fSL/4<=i && fSL*3/4>i && fSL/4<=j && fSL*3/4>j)) // 정방향으로 숫자가 들어가는 영역
    {
     fourMS[i][j] = k;
    }
    else // 아닌 경우 역방향으로 숫자를 집어 넣는 영역입니다.
    {
     fourMS[i][j] = m;
    }
    System.out.print(fourMS[i][j] + " ");
    if(j==(fSL-1)) // 줄을 잘라 줘야 겠지요
    {
     System.out.println();
    }
    k++;
    m--;
   }
  }
 }


 // 홀수 마방진을 만드는 메서드입니다.
 public static void oddSome(int oddNum)
 {
  int oddMS[][] = new int[oddNum][oddNum]; // 홀수 다항 배열 만들기

  int vertical = 0, horizontal = 0; // vertical은 행, horizontal은 열을 나타냅니다.
  horizontal = (oddNum-1)/2; // 열의 중간에서 시작합니다.
  int num = 1; // num은 1씩 늘어나면서 배열에 들어갈 것입니다.
  int x = 0, y = 0; // x랑 y는 나중에 출력할떄 쓰일 겁니다.

  oddMS[vertical][horizontal] = num; // 1을 윗줄 중앙에 넣어주기

  while(num < oddNum*oddNum) // 총 칸수 만큼 반복
  {
   // 한칸 후의 모습을 예상합니다.

   num++;

   if(vertical == 0) // 제일 윗 줄에 있을때
   {
    if(horizontal == (oddNum-1)) // 제일 윗 오른쪽 구석에 있을때
    {
     vertical++;
    }
    else // 아닐때
    {
     vertical = oddNum - 1;
     horizontal++;
    }
   }
   else // 제일 윗 줄이 아닐때
   {
    if(horizontal == (oddNum-1)) // 제일 오른 쪽에 있을때
    {
     vertical--;
     horizontal = 0;
    }
    else // 아닐때
    {
     if(oddMS[vertical-1][horizontal+1] != 0) // 다음 칸이 차여져 있을때
     {
      vertical++;
     }
     else // 안 차여져 있을때
     {
      vertical--;
      horizontal++;
     }
    }
   }

   oddMS[vertical][horizontal] = num;
  }

  for(x=0; x<oddNum; x++)
  {
   for(y=0; y<oddNum; y++)
   {
    System.out.print(oddMS[x][y] + " ");
    if(y==(oddNum-1))
    {
     System.out.println();
    }
   }
  }
 }

  

public static void main(String[] args)
 {
  System.out.println("몇행,열 짜리 마방진을 만들겠습니까?");

  BufferedReader a = new BufferedReader(new InputStreamReader(System.in));

  // 숫자를 받아들입니다.
  try
  {
   length = Integer.parseInt(a.readLine());
  }
  catch(IOException e) {}

  if(length % 4 == 0) // 숫자가 4의 배수일때
  {
   fourSome(length);
  }
  else if(length % 2 != 0) // 숫자가 홀수일때
  {
   oddSome(length);
  }
 }
}

 

세 마방진(4의 배수, 홀수, 4의 배수가 아닌 짝수) 중에서 두개입니다.

4의 배수일때의 마방진과 홀수 마방진 코드입니다.

4의 마방진은 말 그대로 무식하게 짰습니다. 영역 하나 하나 다 지정해줘서 정방향, 역방향 숫자를 집어넣었습니다.

홀수 마방진은 손이 가는 대로 알고리즘을 그대로 따라 만들었습니다.

하면서 뭔갈 하나 발견한게 있는데 제가 지금껏 행과 렬을 반대로 생각했군요.

4의 배수 마방진을 짤떄 까지만 해도 이걸 몰랐습니다. 그래도 4의 배수 마방진은 버그 없이 잘 되더군요;;

힘들었던 점은 홀수 마방진을 짤때 if문을 하나로 다 연결시키는 거였습니다. 경우 경우를 다 연결시키는게 힘들었네요.

허접하지만 참고해 주세요.

짝수 중 4의 배수가 아닌 마방진은 원리조차도 모를 정도로 복잡하네요 -_-;;