[문제] 임의로 입력받은 정수크기의 배열을 만든뒤 달팽이 형식의 방향으로 숫자를 차례대로 넣어 출력하시오.
입력받은 값이 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
[풀이]
[x와 y값의 변화]
1. x=0, y=0,1,2,3,4
2. y=4, x=1,2,3,4
3. x=4, y=3,2,1,0
4. y=3, x=3,2,1
5. x=1, y=1,2,3
6. y=2, x=2,3
7. x=3, y=2,1
8. y=2, x=2
9. x=2, y=2
☞ 반복실행수 : 4, 3, 2, 1
☞ [1,2,3,5,9]번, [2,3,4,8]번줄을 각각 묶어서 보면 y값(또는 x값)이
마지막으로 바뀐뒤 마지막y값보다 -1된 만큼만 수행하며
실행방향이 바껴서 실행된다.
(y값의 변동규칙 : 0,1,2,3,4 / 3,2,1,0 / 1,2,3 / 2,3 / 2)
☞ y값이 변동시, 마지막 수행한 x값은 다음 x값 변동시의 x의 시작위치가 된다.
2번줄 : x의 마지막 변동된 값은 4, 3번줄 x의 값은 4
public static void SnailArray()
{
bool check = true;
int arrCnt = 0;
do
{
try
{
Console.Write("만들고 싶은 배열방의 크기를 정해주세요 : ");
arrCnt = checked(Convert.ToInt32(Console.ReadLine()));
check = false;
//올바른 정수값을 입력받았다면 빠져나옴.
//정수값이 아니라면 에러메시지표시후 재입력하게 한다.
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}while(check);
//입력받은 정수값크기의 배열을 만든다.
int[,] array = new int[arrCnt,arrCnt];
int x = 0; //배열의 열위치
int y = -1; //배열의 행위치
int s = 1; //배열의 숫자입력 방향을 바꿀때 사용
int num = 0; //입력되는 숫자값
int size = arrCnt;
for(int i=0; i<arrCnt; i++)
{
for(int j= 0; j<size; j++)
{
y = y + s; // [0,1,2,3,4] [3,2,1,0] [1,2,3] [2,1] [2]
num++;
array[x,y] = num;
}
size--;
if(size != 0)
{
for(int j = 0; j<size; j++)
{
x = x + s; // [1,2,3,4] [3,2,1] [2,3] [2]
num ++;
array[x,y] = num;
}
}
s = s * (-1); // -1, 1, -1, 1
}
//배열값을 출력한다.
for(int i=0;i<array.GetLength(0); i++)
{
for(int j=0;j<array.GetLength(1);j++)
Console.Write("{0,3}", array[i,j]);
Console.WriteLine();
}
}
SSISO Community