2008년 05월 06일
2차배열의 요소를 달팽이형식 순서로 채우기
저번에 이어 2차배열에 관한 문제 해결책입니다.
이번에도 열혈강의 c프로그래밍 책에서 나온 거 입니다.
열혈강의 c프로그래밍(p. 435)
- 달팽이 형태의 배열을 만들어 주는 프로그램을 작성해 보자. 다음 그림은 달팽이 형태의 벼열이 무엇을 의미하는지 보여주고 있다.
1 2 3 4 1 2 3 4 5
12 13 14 5 16 17 18 19 6
11 16 15 6 15 24 25 20 7
20 9 8 7 14 23 22 21 8
13 12 11 10 9
4*4 2차배열 5*5 2차배열
위 그림에서는 4*4의 달팽이 배열과 5*5의 달팽이 배열을 보여주고 있다. 사용자로부터 하나의 숫자 n을 입력받아서 n*n의 달팽이 배열을 출력해 주는 프로그램을 작성해보자.
실행 예
숫자를 입력하시오 :5
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
책에 나온 팁 : 가로방향을 채우는 반복문과 세로방향을 채우는 반복문을 독립적으로 구성!
-------------------------------------------------------------------------------------
하루종일 고민하다가 안되겠다 싶어가지고 직접 그림을 그려보았습니다.

위에 실행 방향이 그림의 형식으로 되어지더군요.
그린 그림을 오랜 시간 연구끝에 4가지의 경우가 나타내지더군요.
i값을가로의 값, j값을 세로의 값으로 정했을 경우, 또 실행순서가 변화면서 i,j값이 최대로 가질수 있는 값 max와 최소로 가질수있는 값을 min으로 놓았을 때
1.가로(+) -> 세로(+)바뀔때
방향 : 세로의 방향이 아래로 향함
그러므로 i의 값은 증가
j : 변화없음
i : i <- i + 1
max : 변화없음
min : 변화없음
2.세로(+) -> 가로(-)바뀔때
방향 : 가로의 방향이 왼쪽으로 향해감
그러므로 j의 값은 감소
j : j <- j - 1
i : 변화없음
max : max <- max - 1
min : 변화없음
3.가로(-) -> 세로(-)바뀔때
방향 : 세로의 방향이 위로 향함
그러므로 i의 값이 감소
j : 변화없음
i : i <- i-1
max : 변화없음
min : min+1
4.세로(-) -> 가로(+)바뀔때
방향 : 가로의 방향이 오른쪽으로 향해감.
그러므로 j의 값이 증가
j : j <- j+1
i : 변화없음
max : 변화없음
min : 변화없음
이런 것들이 max값이 0이 될때까지 그래서 손으로 직접 실행해 보았습니다.

프로그램 공부를 하다가 어떤 문제가 주어졌을 때 머리 속에서 생각해서 하는 코딩보다는 일단 종이와 펜을 가지고 자신이 만약 컴퓨터라면 이 주어진 문제를 어떻게 해결할까 생각해본 뒤 생각대로 펜으로 종이에 그리면서 혹은 쓰면서 하면 문제를 해결을하는 것이 빠르다고 생각합니다. 그리고 제가한 방법이 좋다고하는 건 아닙니다. 혹시나 헤매시고 계실 분들을 위하여 도움이 되고자하는 거지(그렇다고 제가 c언어에 대해서 완벽하지도 않고요)이게 확실한 방법이다라고 말하지는 않습니다. 지금 제가 생각한 방법보다 훨씬 좋은 방법들이 많다고 생각합니다. 직접 찾아보시고 생각하시고 해결해보세요^^
maxtemp = max-1;
while(maxtemp)
{
if(direction == 1) // 방향이 가로는 오른쪽일때, 세로는 아래쪽일때
{
// printf("\n");
// printf("max : %d\n",maxtemp);
// printf("min : %d\n",min);
while(j<=maxtemp)
{
// printf("i : %d j : %d\n",i,j);
// printf("num : %d\n",num);
arr[i][j] = num;
// printf("arr[%d][%d] : %d\n",i,j,arr[i][j]);
num++;
j++;
}
// printf("\n");
// printf("max : %d\n",maxtemp);
// printf("max : %d\n",min);
/*
가로(+) -> 세로(+) 변화 할 때
i <- i + 1
*/
i += 1;
j -= 1; //루프에서 j값을 쓸데없이 한번더
// printf("\n");
// printf("max : %d\n",maxtemp);
// printf("min : %d\n",min);
while(i<=maxtemp)
{
// printf("i : %d j : %d\n",i,j);
// printf("num : %d\n",num);
arr[i][j] = num;
// printf("arr[%d][%d] : %d\n",i,j,arr[i][j]);
num++;
i++;
}
/*
세로(+) -> 가로(-)로 변화 할 때
j <- j-1
max <- max-1
*/
direction *= -1; //가로와 세로의 값을 감소로 바꾸어 줌
maxtemp -= 1;
// printf("direction : %d\n",direction);
i -= 1; //루프에서 쓸데없이 한번더 i값을 더했으므로
j -= 1;
// printf("\n");
}else if(direction == -1) // 방향이 가로는 왼쪽일때, 세로는 위쪽일때
{
// printf("\n");
// printf("max : %d\n",maxtemp);
// printf("min : %d\n",min);
while(j>=min)
{
// printf("i : %d j : %d\n",i,j);
// printf("num : %d\n",num);
arr[i][j] = num;
// printf("arr[%d][%d] : %d\n",i,j,arr[i][j]);
num++;
j--;
}
/*
가로(-) -> 세로(-)로 변화 할때
i <- i-1
min <- min+1
*/
min += 1;
i -= 1;
j += 1;
// printf("\n");
while(i>=min)
{
// printf("i : %d j : %d\n",i,j);
// printf("num : %d\n",num);
arr[i][j] = num;
// printf("arr[%d][%d] : %d\n",i,j,arr[i][j]);
num++;
i--;
}
/*
세로(-) -> 가로(+)로 변화 할때
j <- j+1
*/
direction *= -1; // 가로와 세로의 값을 증가로 바꾸어줌
// printf("direction : %d\n",direction);
j+=1;
i+=1;
// printf("\n");
}
}
# by | 2008/05/06 18:52 | c | 트랙백 | 덧글(1)















☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
누구는 더운물도 안나오는 외진 섬에서 거지같은 군생활 하고 있는데!!
어쨌든 너도 전역 얼마 안남았으니 빨랑 끝내고 나와랑 나도 얼마 안남았다...