달팽이 배열 출력하기
글. 다산영재학원 오상문 sualchi@daum.net
/*달팽이 배열 출력하기 (오상문 sualchi@daum.net)
정사각형 구조 2차원 배열 한쪽 크기를 입력받고 달팽이 모양으로 숫자를 배치하는 예제입니다.
[입력]
2차원 배열 크기 입력(1~28): 5
[출력]
25 24 23 22 21
10 9 8 7 20
11 2 1 6 19
12 3 4 5 18
13 14 15 16 17
[참고] 1, 2, 3 순서로 출력하려면
1) num 초기값을 1로 정합니다.
2) for 문에 있는 num--; 문을 num++;로 고칩니다.
3) 다시 컴파일하고 실행해서 확인합니다.
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 */
#include <stdio.h>
int arr[30][30]; // 저장할 배열
int lens[60]; // 각 라운드별 진행할 개수 (0라운드부터)
int xp=-1, yp=0; // 시작 위치(0,0에서 왼쪽으로 한칸 이전)
int direction = 0; // 0:동, 1:남, 2:서, 3:북
int round = 0; // 몇 라운드인지 (0 ~ (size+size-1)차)
int num; // 출력 숫자 (max ~ 1 또는 1~ max)
int size; // 정사각형 배열 한변 크기
// 현재 진행 방향에 맞게 xp, yp 값 변경
void move(int direct)
{
switch(direct) {
case 0: xp++; break;
case 1: yp++; break;
case 2: xp--; break;
case 3: yp--; break;
}
}
// arr 배열 정보를 출력
void print_box(int size)
{
int x, y;
printf("\n");
for(y=0; y<size; y++) {
for(x=0; x<size; x++)
printf("%3d ", arr[y][x]);
printf("\n");
}
}
int main( )
{
int i, j;
// 배열 크기 입력
do {
printf("2차원 배열 크기 입력(1~28): ");
scanf(" %d", &size);
} while (size < 1 || size > 28);
num = size*size; // 출력에 사용할 숫자 계산
// 라운드별 진행 개수 계산 (3이면 3, 2, 2, 1, 1, 0 )
for(i=0, j=size; j >= 0; i+=2, j--) {
lens[i] = j;
lens[i+1] = j-1;
}
// 라운드 회차만큼 반복...
while(round < size+size-1) { //1,3,5,7, (nth = size+size-1)
// 각 라운드별 출력 처리
for(i=0; i<lens[round]; i++) {
move(direction); // 방향에 맞게 xp, yp 위치 변경
arr[yp][xp] = num--; // 새 위치에 숫자 출력하고 -1
}
round++; // 라운드 증가
direction = (direction+1)%4; //다음 방향(0:동,1:남,2:서,3:북)
}
print_box(size); // 최종 결과를 화면에 출력
return 0;
}
<이상>
'C' 카테고리의 다른 글
DevCpp printf, scanf 함수 long double 형 %LF 서식 오류 (0) | 2019.04.16 |
---|---|
C 언어, 10진 정수를 2진수로 출력하기 (0) | 2019.03.09 |
C 언어, 최대 공약수(GCD) 구하는 다양한 방법 (1) | 2019.02.23 |
C 언어, 반대 부호 정수를 출력하는 다양한 방법 (0) | 2019.02.19 |
C 언어, 시작과 끝 단 입력받고 구구단 출력하기 (0) | 2019.02.14 |