2차배열의 요소를 달팽이형식 순서로 채우기

저번에 이어 2차배열에 관한 문제 해결책입니다.
이번에도 열혈강의 c프로그래밍 책에서 나온 거 입니다.

열혈강의 c프로그래밍(p. 435)

- 달팽이 형태의 배열을 만들어 주는 프로그램을 작성해 보자. 다음 그림은 달팽이 형태의 벼열이 무엇을 의미하는지 보여주고 있다.

    1    2    3    4             1    2    3    4    5
   12   13   14    5          16   17   18   19    6

   11   16   15    6          15   24   25   20    7

   20    9    8    7           14   23   22   21    8

                                 13   12   11   10    9
     
        4*4 2차배열                    5*5 2차배열

위 그림에서는 4*4의 달팽이 배열과 5*5의 달팽이 배열을 보여주고 있다. 사용자로부터 하나의 숫자 n을 입력받아서 n*n의 달팽이 배열을 출력해 주는 프로그램을 작성해보자.

실행 예

숫자를 입력하시오  :5

   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

책에 나온 팁 : 가로방향을 채우는 반복문과 세로방향을 채우는 반복문을 독립적으로 구성!


-------------------------------------------------------------------------------------


하루종일 고민하다가 안되겠다 싶어가지고 직접 그림을 그려보았습니다.

 

위에 실행 방향이 그림의 형식으로 되어지더군요.
그린 그림을 오랜 시간 연구끝에 4가지의 경우가 나타내지더군요.


i값을가로의 값, j값을 세로의 값으로 정했을 경우, 또 실행순서가 변화면서 i,j값이 최대로 가질수 있는 값 max와 최소로 가질수있는 값을 min으로 놓았을 때


1.가로(+) -> 세로(+)바뀔때
방향 : 세로의 방향이 아래로 향함
       그러므로 i의 값은 증가
j : 변화없음
i : i <- i + 1
max : 변화없음
min : 변화없음

2.세로(+) -> 가로(-)바뀔때
방향 : 가로의 방향이 왼쪽으로 향해감
       그러므로 j의 값은 감소
j : j <- j - 1
i : 변화없음
max : max <- max - 1
min : 변화없음

3.가로(-) -> 세로(-)바뀔때
방향 : 세로의 방향이 위로 향함
       그러므로 i의 값이 감소
j : 변화없음
i : i <- i-1
max : 변화없음
min : min+1

4.세로(-) -> 가로(+)바뀔때
방향 : 가로의 방향이 오른쪽으로 향해감.
       그러므로 j의 값이 증가
j : j <- j+1
i : 변화없음
max : 변화없음
min : 변화없음

이런 것들이 max값이 0이 될때까지 그래서 손으로 직접 실행해 보았습니다.

위에 그림 형식으로 실행이 되더군요.

프로그램 공부를 하다가 어떤 문제가 주어졌을 때 머리 속에서 생각해서 하는 코딩보다는 일단 종이와 펜을 가지고 자신이 만약 컴퓨터라면 이 주어진 문제를 어떻게 해결할까 생각해본 뒤 생각대로 펜으로 종이에 그리면서 혹은 쓰면서 하면 문제를 해결을하는 것이 빠르다고 생각합니다. 그리고 제가한 방법이 좋다고하는 건 아닙니다. 혹시나 헤매시고 계실 분들을 위하여 도움이 되고자하는 거지(그렇다고 제가 c언어에 대해서 완벽하지도 않고요)이게 확실한 방법이다라고 말하지는 않습니다. 지금 제가 생각한 방법보다 훨씬 좋은 방법들이 많다고 생각합니다. 직접 찾아보시고 생각하시고 해결해보세요^^

 



 
maxtemp = max-1;

 while(maxtemp)
 {
  if(direction == 1) // 방향이 가로는 오른쪽일때, 세로는 아래쪽일때
  {
  // printf("\n");
  // printf("max : %d\n",maxtemp);
  // printf("min : %d\n",min);
   
   while(j<=maxtemp)
   {    
  //  printf("i : %d j : %d\n",i,j);
  //  printf("num : %d\n",num);
    arr[i][j] = num;
  //  printf("arr[%d][%d] : %d\n",i,j,arr[i][j]);
    num++;
    j++;      
   }
   
  // printf("\n");
 //  printf("max : %d\n",maxtemp);
 //  printf("max : %d\n",min);
   
   /*
   가로(+) -> 세로(+) 변화 할 때
   i <- i + 1
   */
   i += 1;
   j -= 1; //루프에서 j값을 쓸데없이 한번더
   
 //  printf("\n");
 //  printf("max : %d\n",maxtemp);
 //  printf("min : %d\n",min);
   
   
   while(i<=maxtemp)
   {
 //   printf("i : %d j : %d\n",i,j);
 //   printf("num : %d\n",num);
    arr[i][j] = num;
 //   printf("arr[%d][%d] : %d\n",i,j,arr[i][j]);
    num++;
    i++;
   }
   
   /*
   세로(+) -> 가로(-)로 변화 할 때
   j <- j-1
   max <- max-1
   */
   direction *= -1; //가로와 세로의 값을 감소로 바꾸어 줌
   maxtemp -= 1;
 //  printf("direction : %d\n",direction);
   i -= 1; //루프에서 쓸데없이 한번더 i값을 더했으므로
   j -= 1;
 //  printf("\n");
  }else if(direction == -1) // 방향이 가로는 왼쪽일때, 세로는 위쪽일때
  {
 //  printf("\n");
 //  printf("max : %d\n",maxtemp);
 //  printf("min : %d\n",min);

   while(j>=min)
   {
 //   printf("i : %d j : %d\n",i,j);
 //   printf("num : %d\n",num);
    arr[i][j] = num;
 //   printf("arr[%d][%d] : %d\n",i,j,arr[i][j]);
    num++;
    j--;
   }

   /*
   가로(-) -> 세로(-)로 변화 할때
   i <- i-1
   min <- min+1
   */

   min += 1;
   i -= 1;
   j += 1;

 //  printf("\n");

   while(i>=min)
   {
//    printf("i : %d j : %d\n",i,j);
//    printf("num : %d\n",num);
    arr[i][j] = num;
//    printf("arr[%d][%d] : %d\n",i,j,arr[i][j]);
    num++;
    i--;
   }
   /*
   세로(-) -> 가로(+)로 변화 할때
   j <- j+1
   */

   direction *= -1; // 가로와 세로의 값을 증가로 바꾸어줌
//   printf("direction : %d\n",direction);   
   j+=1;
   i+=1;

//   printf("\n");   
  }
 }

by 가난한시인 | 2008/05/06 18:52 | c | 트랙백 | 덧글(1)

트랙백 주소 : http://dongmy.egloos.com/tb/4340175
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 미나기 at 2008/05/18 09:47
이 녀석. 군대에서도 프로그래밍 공부를 할 수 있다니 ㅠㅠ
누구는 더운물도 안나오는 외진 섬에서 거지같은 군생활 하고 있는데!!
어쨌든 너도 전역 얼마 안남았으니 빨랑 끝내고 나와랑 나도 얼마 안남았다...

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶