본문 바로가기
Algorithm

n*n배열을 숫자로 대각선으로 위아래 이동하며 채우기

by BeGeek 2015. 4. 9.

NumberDiagonalShape.java


 

 /**
 * NumberDiagonalShape
 * n*n배열을 숫자로 대각선으로 위아래 이동하며 채우기
 *
 * 1  3  4  10 11
 * 2  5  9  12 19
 * 6  8  13 18 20
 * 7  14 17 21 24
 * 15 16 22 23 25
 *
 **/
 
 int [][] map;  //숫자를 채울 배열
 int n = 5;   //배열길이
 int cnt = 1; //채울 숫자
 
 //생성자
 public NumberDiagonalShape(){
  map = new int[n][n];
 }
 
 //숫자 채우기
 public void numberFill(int a, int b){
  
  int r = a; //row
  int c = b; //col
  
  if(a == n-1 && b == n-1){
   map[a][b] = cnt++;
   return;
  }
  
  
  
  if(a%2 == 1){ //0부터 시작하는 행 인덱스 기준 홀수일때 좌측에서 우측상단으로 채우기
  
   if(a < n){
    
    map[a][b] = cnt++;
    
    //좌측에서 우측상단으로 채우기
    while( a != c && b != r){
     map[--a][++b] = cnt++;
    }
    
    numberFill(a, ++b);
   }else{
    a = n;
    while(a != c-1 && b != r-1){
     map[--a][++b] = cnt++;
    }
    
    if( map[n-1][n-1]!=0)return;
    
    numberFill(++a,b);
   }
   
   
  }else{
   if(b < n){
    
    map[a][b] = cnt++;
    
    while(a != c && b != r){
     map[++a][--b] = cnt++;
    }
    
    numberFill(++a,b);
    
   }else{
    b = n;
    while(a != c-1 && b != r-1){
     map[++a][--b] = cnt++;
    }
    
    if(map[n-1][n-1]!=0)return;
    
    numberFill(a,++b);
   }
   
   
   
  }
  
  
  
 
 }
 
 //map출력
 public void printMap(){
  
  for(int i=0; i < map.length; i++){
   for(int j=0; j < map[0].length; j++){
    
    System.out.printf("%3d",map[i][j]);
    if(j == map[0].length-1){
     System.out.println();
    }
   }
  }
 }
 
 //실행
 public static void main(String[] args) {

  NumberDiagonalShape nds = new NumberDiagonalShape();
  nds.numberFill(0,0);
  nds.printMap();
 }

}
 

실행결과

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

 

댓글