[SBS게임아카데미] 1인개발 프로그래밍 (C#, 유니티)

[8] C# 숫자 배열, 시계열 배열 (SBS게임아카데미 7일차_230722_토)_과제풀이

개발린마케터 2023. 7. 23. 21:58
반응형

지난 주중에 나왔던 과제 풀이부터!

*** 예제 ***
아래 배열을 출력해보자

뇌가 쫄깃쫄깃해지는 예제!

(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]);

                }

솔직히 말하면 아직 완전히 이해하지 못했다...

좀 더 뜯어보아야 알 수 있을 듯...

 

반응형