지난 주중에 나왔던 과제 풀이부터!
*** 예제 *** 아래 배열을 출력해보자 |
(1번) 25부터 거꾸로 1까지
int[,] arr1 = new int[5, 5];
int idx = 25;
for (int a = 0; a < arr1.GetLength(0); a++)
{
for (int b = 0; b < arr1.GetLength(1); b++)
{
arr1[a, b] = idx--;
Console.Write("{0}\t", arr1[a, b]);
}
Console.WriteLine("");
}
Console.WriteLine("");
2번) 좌우 지그재그로 아래로
[2번 내가 푼 것]
int[,] arr2 = new int[5, 5];
int idx = 1;
for (int i = 0; i < arr2.GetLength(0); i++)
{
if (i % 2 == 0)
{
for (int j = 0; j < arr2.GetLength(1); j++)
{
arr2[i, j] = idx++;
}
}
else
{
for (int j = 4; j > -1; j--)
{
arr2[i, j] = idx++;
}
}
}
for (int k = 0; k < arr2.GetLength(0); k++)
{
for (int l = 0; l < arr2.GetLength(1); l++)
{
Console.Write("{0}\t", arr2[k, l]);
}
Console.WriteLine("");
}
[2번 선생님이 푼 것]
int[,] arr = new int[5, 5];
int id = 1;
int x = 0; //정렬 시 좌 또는 우 이동 방향 설정할 변수
for (int i = 0; i < arr.GetLength(0); i++)
{
for (int j = 0; j < arr.GetLength(1); j++)
{
arr[i, x] = id++; //arr[i,x] 해당 인덱스에 id의 값을 대입 후 id의 값을 1 증가.
if (i % 2 == 0) // i % 2의 값이 0이면, 짝수일 때 오른쪽으로 이동
{
if (j < 4) //j의 값이 4보다 작다면 오른쪽으로 이동
{
x++; //x의 값을 증가
}
}
else
{
if (j < 4) //왼쪽으로 이동
{
x--;
}
}
}
}
for (int i = 0; i < arr.GetLength(0); i++)
{
for (int j = 0; j < arr.GetLength(1); j++)
{
Console.Write("{0}\t", arr[i, j]);
}
Console.WriteLine();
}
나는 바로 i와 j를 좌표에 연결한 데 반해 선생님은 x라는 별도의 변수를 통해 좌우 이동을 통제했다.
3번) 상하로 오른쪽으로 차례차례
int[,] arr3 = new int[5, 5];
int idx = 1;
for (int i = 0; i < arr3.GetLength(0); i++)
{
for (int j = 0; j < arr3.GetLength(1); j++)
{
arr3[j, i] = idx++;
}
}
for (int k = 0; k < arr3.GetLength(0); k++)
{
for (int l = 0; l < arr3.GetLength(1); l++)
{
Console.Write("{0}\t", arr3[k, l]);
}
Console.WriteLine("");
}
Console.WriteLine("");
4번) 상하지그재그로 오른쪽으로
[4번 내가 푼 것]
int[,] arr4 = new int[5, 5];
int idx = 1;
for (int i = 0; i < arr4.GetLength(0); i++)
{
if (i % 2 == 0)
{
for (int j = 0; j < arr4.GetLength(1); j++)
{
arr4[j, i] = idx++;
}
}
else
{
for (int j = 4; j >= 0; j--)
{
arr4[j, i] = idx++;
}
}
}
for (int k = 0; k < arr4.GetLength(0); k++)
{
for (int l = 0; l < arr4.GetLength(1); l++)
{
Console.Write("{0}\t", arr4[k, l]);
}
Console.WriteLine("");
}
Console.WriteLine("");
[4번 선생님이 푼 것]
int[,] arr2 = new int[5, 5];
int id = 1;
int y = 0; //상하 이동방향을 제어할 변수
for (int i = 0; i < arr2.GetLength(0); i++)
{
for (int j = 0; j < arr2.GetLength(1); j++)
{
arr2[y, i] = id++;
if (i % 2 == 0) //짝수일때
{
if (j < 4)
{
y++; //아래로 이동
}
}
else
{
if (j < 4)
{
y--; //위로 이동
}
}
}
}
for (int i = 0; i < arr2.GetLength(0); i++)
{
for (int j = 0; j < arr2.GetLength(1); j++)
{
Console.Write("{0}\t", arr2[i, j]);
}
Console.WriteLine();
}
위의 2번과 마찬가지로 y를 통해 상하이동을 통제했다.
*** 예제 *** 시계열 배열 정렬 |
[내가 푼 것]
int[,] arr5 = new int[5, 5];
int idx = 1;
for (int i = 0; i < 1; i++)
{
for (int j = 0; j < 5; j++)
{
arr5[i, j] = idx++;
}
}
for (int k = 4; k > 3; k--)
{
for (int l = 1; l < 5; l++)
{
arr5[l, k] = idx++;
}
}
for (int m = 4; m > 3; m--)
{
for (int n = 3; n >= 0; n--)
{
arr5[m, n] = idx++;
}
}
for (int o = 0; o < 1; o++)
{
for (int p = 3; p >= 1; p--)
{
arr5[p, o] = idx++;
}
}
for (int q = 1; q < 2; q++)
{
for (int r = 1; r < 4; r++)
{
arr5[q, r] = idx++;
}
}
for (int s = 3; s < 4; s++)
{
for (int t = 2; t < 4; t++)
{
arr5[t, s] = idx++;
}
}
for (int u = 3; u < 4; u++)
{
for (int v = 2; v > 0; v--)
{
arr5[u, v] = idx++;
}
}
for (int w = 2; w < 3; w++)
{
for (int x = 1; x < 3; x++)
{
arr5[w, x] = idx++;
}
}
for (int a = 0; a < arr5.GetLength(0); a++)
{
for (int b = 0; b < arr5.GetLength(1); b++)
{
Console.Write("{0}\t", arr5[a, b]);
}
Console.WriteLine("");
}
그래도 기존에 다른 문제는 방향 자체는 이해하고 어떻게 해야 할지 막막한 게 많았는데 이건 어디서부터 어떻게 풀어야할 지도 막막했다. 다음과 같은 어려움이 있었다.
규칙을 주기에는 지그재그식의 방향 전환이 아니었다. 어떤 좌표의 숫자가 커졌다가 작아졌다 커졌다가 작아졌다면 다행인데 커졌다. 커졌다. 작아졌다. 작아졌다 식으로 반복했고, 방향도 그런 식이었다. 좌표의 앞의 숫자가 변화했다가 뒤의 숫자가 변화했다가... 또 이동하는 칸의 수도 차라리 5칸, 4칸, 3칸, 2칸이면 모르겠는데 그렇지 않아서 이걸 어떻게 규칙으로 정의할 것이냐 자체가 너무 어려웠다.
결국 이런 저런 고민 끝에 이동하는 한줄 한줄을 따로 쪼개서 코드를 짰다.
(하아... ex-수포자의 머릿속이 너무 복잡해져서 어쩔 수 없었...)
그래도 풀었다는데에 의의를 둔다.....
[선생님이 푼 것]
int[,] arr3 = new int[5, 5];
int nextTurnCount = 4; //축 전환 비교할 변수
int moveCount = 5; //축 전환 이후 이동해야 할 횟수 변수
int x = 0;
int y = 0;
int turnCount = 0; //방향 전환 비교 변수
int dir = 1; //방향 전환 변수 +, -
for (int i = 0; i < arr3.Length; i++)
{
arr3[y, x] = i + 1; //arr3[y,x] 해당 공간 i에 1 더한 값을 대입
//i의 값이 nextTurnCount의 값과 같다면 방향 전환. x -> y or y -> x 전환. 좌우이동 -> 상하이동 or 상하이동 -> 좌우이동
if (i == nextTurnCount)
{
if (turnCount % 2 == 0) //현재 이동 방향으로 계속 이동
{
moveCount--; //다음 방향 전환까지 남은 이동 횟수 감소
}
else
{
dir *= -1; //방향 변경. 오른쪽 -> 왼쪽 왼쪽 -> 오른쪽 or 아래 -> 위 위 -> 아래
}
nextTurnCount += moveCount; //다음 턴 전환이 일어나는 횟수에 이동 횟수를 추가
turnCount++;
}
if (turnCount % 2 == 0) x = x + dir; //좌우이동
else y = y + dir;
}
for (int i = 0; i < arr3.Length; i++)
{
if (i % 5 == 0 && i != 0)
{
Console.WriteLine("");
}
Console.Write("{0}\t", arr3[i / 5, i % 5]);
}
솔직히 말하면 아직 완전히 이해하지 못했다...
좀 더 뜯어보아야 알 수 있을 듯...
'[SBS게임아카데미] 1인개발 프로그래밍 (C#, 유니티)' 카테고리의 다른 글
[10] C# 클래스의 생성과 소멸, 접근제한자 (SBS게임아카데미 8일차_230723_일) (0) | 2023.07.23 |
---|---|
[9] C# 클래스와 생성자 (SBS게임아카데미 7일차_230722_토)_본수업 (0) | 2023.07.23 |
[7] C# 함수와 호출 (SBS게임아카데미 6일차_230716_일) (0) | 2023.07.23 |
[6] C# 배열과 정렬 (SBS게임아카데미 5일차_230715_토) (0) | 2023.07.17 |
[5] C# 제어문, 별 찍기, 배열 (SBS게임아카데미 4일차_230702_일) (0) | 2023.07.15 |