평범한 이야기들

[C]C언어 달팽이- 본문

평범한 개발 이야기/ETC

[C]C언어 달팽이-

songsariya 2008. 6. 11. 19:05
728x90
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  달팽이;


 C언어를 배운지 벌써 3년이 지난 시점에 갑자기 달팽이 프로그램이 생각이 났다.
언어를 배울 당시 이 문제를 접하고서는 해결하지 못한체 기억속에서 사라졌다.
그래서 그런지 한 번 해볼까 란 생각 으로 프로그램에 대해서 생각해봤다.

1. 규칙

 이 프로그램에서는 어떤 규칙이 있을까 생각을 했다.

2차원 배열을 사용해야 하니깐 먼저 방향을 생각했다.
→,↓으로 움직을때는 배열의 인덱스가 증가
←↑으로 움직일때는 배열의 인덱스 감소.

또하나의 규칙은 이 행렬을 돌면서의 각 숫자를 넣는 수가 일정하게 감소한다는것이다.
5X5 행렬에 자료값을 넣는다면 5,4,4,3,3,2,2,1,1 이 순서대로 자료값을 넣는다.(우측방향)
곧 저 순서는 (2*n-1) 이라는 식이 성립된다.


#include <stdio.h>
#include <stdlib.h>
 
int main(void){

 int n = 0;   // 입력받을 행렬의 크기값
 int index;   // 규칙을 사용하기 위해
 int x=-1, y=0;  //행렬의 이동값
 int i, j, z;  //for 루프를 위한 변수
 int direction = 1; //행렬의 방향 '+' or '-'
 int **matrix = NULL; //동적배열을 만들기 위해 포인터의포인터
 int cnt=1;

//자료값 받기.
 printf("Input the Number : ");
 scanf("%d",&n);

 //C언어 임으로 동적메모리 할당.
 matrix = (int **)malloc(n * sizeof(int*));
 
 for(z = 0;z < n; z++){
  matrix[z] = (int*)malloc(n * sizeof(int));
 }
 
 //전체적으로 돌아가는 for 루프
 index = n - 1;

for(z = 0; z < (2 * n - 1); z++){

 //행이동 for 루프
  for(i = 0; i <= index; i++ ){
  
   x += direction;
   matrix[x][y] = cnt;
         
   cnt++;
  }

 //규칙적용
  index--;

 //열이동 for 루프
  for(j = 0 ;j <= index; j++){
   
   y += direction;
   matrix[x][y] = cnt;
   
      
   cnt++;
  }

//방향 지정
  direction *= -1;
 }
 
 //출력 
 for(i = 0;i < n; i++){
  for(j = 0;j < n; j++){
   printf("%3d",matrix[j][i]);
  }
  printf("\n");
 }

free(matrix); //동적배열 해제
 return 0;
}

C언어를 생각해 만들어 최대한 C언어 답게 작성 해봤다.
-하지만 소스코드가 왜이렇게 지저분한지.. 변수들도 그렇고.. 나의 실력의 한계인가..
-나름 생각써 동적메모리할당으로 배열을 만들어야 겠다 생각해 포인터의 포인터를 써봤다.
-Visual C++은 역시 익숙치 않아서 그런지 compile 이나  link 중이라고 왜케 뜨는지.. 하소연 ㅠ


728x90
Comments