ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [알고리즘/C언어] 도형 알고리즘 / 사각형 ㄹ자 채우기 (정보처리기사, 실기)
    Algorithm 2019. 5. 24. 21:42

    1    2    3    4    5

    6    7    8    9    10

    11  12  13   14   15

    16  17  18   19   20

    21  22  23   24   25

     

    지난번에 배열을 정리하면서 사각형 모양으로 숫자를 출력하는 코드를 정리했었다.

    (단 주의해야할 것은 아래 코드는 0행 0열이 아닌 1행 1열부터 숫자를 채운 코드이다.)

     

    #include <stdio.h>
    #define NUM 5
    int main() {
    	int row, col, i, j, k = 0;
    	int arr1[NUM + 1][NUM + 1] = { 0 };
    	//사각형 도형 채우기
    	printf("-----------------------\n");
    	for (row = 1; row <= NUM; row++) {
    		for (col = 1; col <= NUM; col++) {
    			k = k + 1;
    			arr1[row][col] = k;
    		}
    	}
    	for (i = 1; i <= NUM; i++) {
    		for (j = 1; j <= NUM; j++) {
    			printf("%3d", arr1[i][j]);
    		}
    		printf("\n");
    	}
    	printf("-----------------------\n");
    	system("pause");
    	return 0;
    }

     

     

    이번에는 ㄹ자 모양으로 채우려고 한다.

     

    1    2    3    4    5

    10   9    8    7    6

    11  12   13  14  15

    20  19   28  17  16

    21  22   23  24  25

     

    이렇게 말이다.

    이번에도 1행 1열부터 숫자를 채웠다.

     

    #include <stdio.h>
    #define NUM 5
    int main() {
    	int i, j, k = 0;
    	int arr1[NUM + 1][NUM + 1] = { 0 };
    	for (i = 1; i <= NUM; i++) {
    		if (i % 2 == 1) {
    			for (j = 1; j <= NUM; j++) {
    				k = k + 1;
    				arr1[i][j] = k;
    			}
    		}
    		else {
    			for (j = NUM; j >= 1; j--) {
    				k = k + 1;
    				arr1[i][j] = k;
    			}
    		}
    	}
    	printf("---- data  출력-------\n");
    	for (i = 1; i <= NUM; i++) {
    		for (j = 1; j <= NUM; j++) {
    			printf("%3d", arr1[i][j]);
    		}
    		printf("\n");
    	}
    
    	printf("\n");
    	system("pause");
    	return 0;
    }

     

    그러니까 행의 index가 홀수이면 왼쪽부터 숫자를 채우고

    짝수이면 오른쪽부터 숫자를 채운다. (1행 1열부터 채운다는 점을 꼭 명심해야 한다.)

     

     

    #include <stdio.h>
    #define NUM 5
    int main() {
    	int  i, j, k = 0;
    	int arr1[NUM][NUM] = { 0 };
    	for (i = 0; i < NUM; i++) {
    		if (i % 2 == 0) {
    			for (j = 0; j < NUM; j++) {
    				k = k + 1;
    				arr1[i][j] = k;
    			}
    		}
    		else {
    			for (j = NUM-1; j >= 0; j--) {
    				k = k + 1;
    				arr1[i][j] = k;
    			}
    		}
    	}
    	printf("---- data  출력-------\n");
    	for (i = 0; i < NUM; i++) {
    		for (j = 0; j < NUM; j++) {
    			printf("%3d", arr1[i][j]);
    		}
    		printf("\n");
    	}
    
    	printf("\n");
    	system("pause");
    	return 0;
    }

     

    만약 0행 0열부터 숫자를 채우고 싶다면 위의 코드로 바꿔주면 된다.

     

     

     

     

    근데 행의 index가 홀수일 때랑 짝수일 때,

    같은 코드를 사용하여 연산할 수는 없을까?

     

    이럴 때 지난번 수열의 합 알고리즘에서 sw 변수를 사용하여

    양수와 음수를 토글했던 문제를 기억해내야 한다.

     

    #include <stdio.h>
    #define NUM 5
    int main() {
    	int  i, j, k = 0, sw = 1, s = 0, e = 4, temp;
    	int arr1[NUM][NUM] = { 0 };
    	for (i = 0; i < 5; i++) {
    		for (j = s; j != e + sw; j = j + sw) {
    			k = k + 1;
    			arr1[i][j] = k;
    		}
    		sw = -sw;
    		temp = s;
    		s = e;
    		e = temp;
    	}
    	printf("---- data  출력-------\n");
    	for (i = 0; i < NUM; i++) {
    		for (j = 0; j < NUM; j++) {
    			printf("%3d", arr1[i][j]);
    		}
    		printf("\n");
    	}
    
    	printf("\n");
    	system("pause");
    	return 0;
    }

     

    그러니까 우리는 안쪽의 for문을 (j = 0; j < 5; j++) {}에서

    (j = 0; j != 5; j = j + 1;)로 바꿀 수 있다.

     

    이제 (j = 0; j != 5; j = j + 1;) 부분을 

    (j = 0; j != 4 + 1; j = j + 1;)

    (j = 4; j != 0 + (-1); j = j + (-1);)로 번갈아가면서 수행하도록 만들어야 한다.

     

    변수 s에 0, e에 4를 할당한 후, sw변수에 1을 할당한다.

     

    (j = s; j != (+ sw); j = j + sw) {}로 작성한다.

     

    연산을 할 때마다 sw의 값은 -sw로,

    s와 e의 값은 교환을 해준다.

     

    이 때 변수 값의 교환temp라는 새로운 변수를 선언하여

    그 변수에 값을 저장하는 방법으로 교환하였는데,

    temp변수를 만들지 않고 값을 교환하는 방법도 있다.

     

    s = s + e;
    e = s - e;
    s = s - e;

     

    좀 더 이해하기 쉽게 그림으로 그려보면 다음과 같다.

     

    두 변수의 숫자값을 교환하는 법

     

     

    #include <stdio.h>
    #define NUM 5
    int main() {
    	int  i, j, k = 0, sw = 1, s = 1, e = 5;
    	int arr1[NUM + 1][NUM + 1] = { 0 };
    	for (i = 1; i <= 5; i++) {
    		for (j = s; j != e + sw; j = j + sw) {
    			k = k + 1;
    			arr1[i][j] = k;
    		}
    		sw = -sw;
    		
    		s = s + e;
    		e = s - e;
    		s = s - e;
    	}
    	printf("---- data  출력-------\n");
    	for (i = 1; i <= NUM; i++) {
    		for (j = 1; j <= NUM; j++) {
    			printf("%3d", arr1[i][j]);
    		}
    		printf("\n");
    	}
    
    	printf("\n");
    	system("pause");
    	return 0;
    }

     

    1행 1열부터 숫자를 채우고 싶다면 위와 같이 바꿔주면 된다.

    이번에는 temp변수 없이 숫자를 교환해주었다.

     

     

     

    실행결과

    반응형

    COMMENT