-
[알고리즘/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 != (e + 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변수 없이 숫자를 교환해주었다.
반응형'Algorithm' 카테고리의 다른 글
[알고리즘/자바스크립트] 중복값 없는 랜덤 숫자 추출하는 여러가지 방법 / 로또번호 생성기 (2526) 2019.06.03 [알고리즘/C언어] 도형 알고리즘 / 직각삼각형 채우기 (정보처리기사, 실기) (0) 2019.05.25 [알고리즘/C언어] 수열의 합 알고리즘(5) / Sum = (1 * 10) + (2 * 9) + (3 * 8) + ... + (10 * 1) (정보처리기사, 실기) (0) 2019.05.24 [알고리즘/C언어] 수열의 합 알고리즘(4) / 합과 차 반복 (정보처리기사, 실기) (0) 2019.05.24 [알고리즘/C언어] 구구단 출력을 goto문으로 해보자 (정보처리기사, 실기) (0) 2019.05.23 COMMENT