1. 문제 - 반시계방향의 달팽이 배열을 만들어라
1-1. 예시 -

1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7

#include <stdio.h>
int main(){
int i=0;
int j=0;
int val = 1;

int a[4] = { 1, 0, -1, 0 };
int b[4] = { 0,1,0,-1 };
int arr[4][4] = { 0, }; // 4x4 배열을 0으로 초기화했다.
int sel = 0;

while (!arr[i][j]){ // a[i][j]에 0 아닌 값이 들어있을 때 종료
arr[i][j] = val++;

if (arr[i + a[sel]][j + b[sel]] != 0){ // 0이 아닌 값이면 if문 실행
sel = (sel + 1) % 4; // 0 1 2 3 반복하기위해
}
i = i + a[sel]; // 1 2 3 3 .. 반복
j = j + b[sel]; // 0 0 0 1 .. 반복
}

for (i = 0; i < 4; i++){
for (j = 0; j < 4; j++){
printf("%3d", arr[i][j]); // i j와 j i를 출력해봐라 시계 반시계방향 달팽이
}
printf("\n");
}
return 0;
}
// 달팽이 배열을 이 소스로 똑같이 시계방향으로 만들어봐라
// int a[4] = { 1, 0, -1, 0 }; int b[4] = { 0,1,0,-1 }; 이 값만 단순히 바뀌면 될 것 같나?
// 결과를 출력해보고 고민해보자

2. 문제 - 시계방향으로 된 3x3 배열을 for문 2개로 만들기
2-1. 예시 -

1 2 3
8 9 4
7 6 5

// 달팽이 배열 문제는 for문 2개를 사용하여 작성하는 방법도 있다.
예를들어 3x3 시계방향 달팽이라면 00 01 02 (3번) 12 22 (2번) 21 20 (2번) 10 (1번) 11 (1번)
반복수는 3 2 2 1 1 이다.

while문{
for문 (시작 - 3번반복)
반복길이-1
break문
for문
}

이렇게 짜면 3 2 2 1 1 번을 반복하는 달팽이 배열을 만드는 반복문 틀을 만들 수 있다.
그 다음은 배열의 인자 위치 조정이다.
그림으로 그려보겠다.

while()문
for문
3번 <0> <0 1 2> // 뒷배열이 유동적이며 더함 // 의미는 배열 앞은 0 고정이고 뒤는 0 1 2로 돌아가며 바뀐다.
2번 <2> <1 0> // 뒷배열이 유동적이며 뺌
1번 <1> <1> // 뒷배열이 유동적이며 더함
(for문 길이-1)
(break문)
for문
2번 <1 2> <2> // 앞 배열이 유동적이게 더함
1번 <1> <0> // 앞배열이 유동적이며 뺌
// 다시 확인해보자

#include <stdio.h>
int main(){
int arr[3][3]; // 3x3 배열
int val =0; // 배열에 넣어줄 수
int a=0; // a가 0인 이유는 첫번째 포문에서 배옆 앞 0은 변동되면 안된다.
int b=-1; // 처음에 b+k에서 0을 만들기 위해 -1로 함
int k=1; // k는 1과 -1을 바꿔주며 배열 값을 조정한다.
int len = 3; // i를 반복할 길이
int i;

while(1){
for(i=0; i<len; i++){
val++; // 1... 9까지 증가할 값
b=b+k; // a값은 첫번째 for문에서 바뀌면 안된다.
arr[a][b] = val; // a[0][0]= 1; a[0][1] = 2; a[0][2] = 3;
}
if(val == 9){ // 달팽이 배열의 마지막 값은 9이다.
break; // while문을 벗어나며 끝난다.
}
len--; // 위보다 1번 적게 반복한다.

for(i=0; i<len; i++){
val++;
a=a+k;
arr[a][b] = val; // 배열의 두번째 인자가 고정되어야 한다.
}
k= k*-1; // 유동적으로 + - 를 써주기 위해
}

for(a=0; a<3; a++){ // 배열을 출력해준다. 변수 a,b는 재활용 하도록 하자
for(b=0; b<3; b++){
printf("%3d", arr[a][b]);
}
printf("\n");
}
return 0;
}

// 달팽이 배열은 생각보다 어렵다. for문의 깊은 이해가 필요하다.

블로그 이미지

ryancha9

https://blog.naver.com/7246lsy

,