SSISO Community

갤러리정

[문제풀이] 달팽이 배열 - 재귀호출 사용 - CSharp

달팽이  배열은  (x좌표값  증가),  (y좌표값  증가),  (x좌표값  감소),  (y좌표값  감소)의  패턴을  가지고  있다.  그리고  조금  더  자세히  보면  x,  y좌표값이  증가하는  부분과  x,  y좌표값이  감소하는  부분을  볼  수  있다.  이런  패턴을  재귀호출  함수를  사용해서  배열을  구현할  수  있다.

  

              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  

  

[재귀호출  함수를  만드는  방법]

  

1)  재귀호출이  끝나는  조건(종료  조건)을  정해주어야  한다.  종료  조건은  재귀호출  함수의  처음  부분에  코딩해야  한다.  그래야  이번  재귀호출을  수행할  것인가  말  것인가에  대한  결정을  할  수  있기  때문이다.  달팽이  배열에서의  종료  조건은  배열의  숫자가  16이  인쇄가  되면  끝내는  것이다.

  

2)  처리  작업을  수행한다.  달팽이  배열에서는  배열에  숫자를  집어넣는  일이  처리해야할  일이므로,  이에  대한  작업을  해준다.

  

3)  재귀호출을  한다.  현재  단계에서  처리해야할  작업이  끝났으므로  다음  작업을  위해서  재귀호출을  해준다.  달팽이  배열에서는  1~7까지  처리가  끝났다면  8~12까지의  작업을  처리하기  위해  재귀호출을  한다.

  

  //num=카운트,  x=열,  y=행    

    public  static  int  num  =  0;
    public  static  int  x=-1;
    public  static  int  y=0;

    public  static  void  SnailArray03()
    {
              bool  check  =  true;
              int  arrCnt  =  0;
              do
              {
                      try
                      {
                              Console.Write("만들고  싶은  배열방의  크기를  정해주세요  :  ");
                              arrCnt  =  checked(Convert.ToInt32(Console.ReadLine()));
                              check  =    false;
                        }
                        catch(Exception  e)
                        {
                                Console.WriteLine(e.Message);
                        }
              }while(check);

  

              int[,]  array  =  new  int[arrCnt,arrCnt];

  

              //재귀호출
              CircularArray(arrCnt,  1,  ref  array);    //재귀함수의  초기값  설정

              for(int  i=0;i<array.GetLength(0);  i++)
              {
                        for(int  j=0;j<array.GetLength(1);j++)
                                    Console.Write("{0,3}",  array[i,j]);
                        Console.WriteLine();
              }  

    }

  

    public  static  void  CircularArray(int  n,  int  direct,  ref  int[,]  array)
    //재귀호출함수,  n=n차정방행렬,  direct=행열방향에  대한  증가치,  array=배열방
    {
              if(n!=0)
              {
                          for(int  i=0;  i<(2*n-1);  i++)  //2*n-1개의  카운트를  채운다.

                          {  
                                if(i  <  n)
                                          x  +=  direct;  //열  방향으로  증가,  감소  한다

                                else
                                          y  +=  direct;  //행  방향으로    증가,  감소  한다

                                array[y,x]  =  ++num;  
                          }  
                          CircularArray(n-1,  direct  *  (-1),  ref  array);  //방향을  바꾸어서  재귀호출을  한다.
                  }
    }

[출처]  [펌]  [문제풀이]  달팽이  배열  -  재귀호출  사용|작성자  눈꽃천사

1703 view

4.0 stars