티스토리 뷰

C# 배우는 중이고 배열과 함수를 배웠다 그리고 간단하게 메모리 구조를 배웠다

배열을 이용하여 빙고 게임을 만들었다 사실 배열 개념에 대해 나름 잘 알기도 하고 백준에서 빙고 문제도 풀어봐서 빙고를 확인하는 로직은 내가 짰다 그때는 Swift로 짰는데 C#에 익숙해지고 알고리즘을 다시 복습하는 느낌으로 하기 좋았다


💻 C#

배열

int[] nums = new int[3]; // 크기만 지정
int[] numbers = { 1, 2, 3 }; // 선언과 초기화

nums[0] = 10;
nums[1] = 20;
nums[2] = 30;

foreach (int num in nums)
{
    Console.WriteLine(num);
}

new 는 메모리를 만들겠다는 키워드

string[] fruits = { "사과", "바나나", "오렌지" }; // 배열
var fruits2 = new List<string> { "사과", "바나나", "오렌지" }; // 리스트

foreach (var fruit in fruits2)
{
    Console.WriteLine($"오늘의 과일은 {fruit}");
}

배열은 고정 크기, 리스트는 가변 크기

string[] subjects = { "국어", "영어", "수학" };
int[] scores = new int[3];

for (int i=0; i<subjects.Length; i++)
{
    Console.Write($"{subjects[i]} 점수를 입력해 주세요 : ");
    int input = int.Parse(Console.ReadLine());
    scores[i] = input;
}

Console.WriteLine($"총점 : {scores.Sum()} | 평균: {(int)scores.Average()}");

배열 요소의 합과 평균을 구하기 위해 Sum() 과 Average() 사용

배열의 길이를 구하기 위해 Length() 사용

2차원 배열

int[,] arr = new int[3, 4];

int[,] arr2 =
    { { 1, 2, 3, 4 },
    { 5, 6, 7, 8 },
    { 9, 10, 11, 12 } };
    
for(int i=0; i<3; i++)
{
    for(int j=0; j<4; j++)
    {
        Console.Write($"{arr2[i, j]} ");
    }
    Console.WriteLine();
}

가변 배열

int[][] jaggedArr = new int[3][];

jaggedArr[0] = new int[] { 1, 2 };
jaggedArr[1] = new int[] { 3, 4, 5 };
jaggedArr[2] = new int[] { 6 };

for(int i=0; i<jaggedArr.Length; i++)
{
    for(int j=0; j < jaggedArr[i].Length; j++)
    {
        Console.Write($"{jaggedArr[i][j]} ");
    }
    Console.WriteLine();
}

C#의 메모리 구조

메모리 영역 정의 특징
스택 (Stack) 메서드 호출 시 사용하는 메모리 영역 LIFO(Last In First Out) 구조 / 메서드 종료 시 자동 해제 / 값 타입과 일부 참조 변수 저장
힙 (Heap) 동적으로 생성된 객체가 저장되는 메모리 영역 메모리 크기 동적 변경 가능 / 객체(참조 타입) 저장 / 가비지 수집기로 자동 해제
메서드 영역 (Method Area) 프로그램의 메타데이터, 코드, 상수 및 static 변수를 저장하는 영역 클래스와 메서드 정보 저장 / 프로그램 시작 시 로드
GIL (Global Interpreter Lock) 여러 스레드가 동시에 실행되는 구조 C#에서는 GIL이 존재하지 않음 / 스레드 간 동기화 유지
가비지 수집기 (Garbage Collector) 사용하지 않는 메모리를 자동으로 해제하는 시스템 힙에 저장된 참조되지 않는 객체를 찾아 메모리 정리

함수

static void PrintLoading()
{
    Console.WriteLine("Loading..");
    Thread.Sleep(100);
    Console.WriteLine("Loading...");
    Thread.Sleep(100);
    Console.WriteLine("Loading....");
    Thread.Sleep(100);
    Console.WriteLine("Loading.....");
}

static void PrintAttack(int att)
{
    Console.WriteLine($"캐릭터의 공격력은 {att}입니다");
}

static int BaseAttack()
{
    int att = 10;
    return att;
}

static int Add(int n1, int n2)
{
    int sum = n1 + n2;
    return sum;
}

🕹️ 콘솔 게임 만들기

2차원 배열 빙고

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace BingoGame2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.OutputEncoding = System.Text.Encoding.UTF8;

            Console.SetWindowSize(80, 25);
            Console.SetBufferSize(80, 25);

            for (int i = 0; i < 4; i++)
            {
                Console.Write("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓");
                for (int j = 1; j <= 10; j++)
                {
                    var emoji = (i % 2 == 0) ? "💙" : "💛";
                    if (j == 5)
                    {
                        Console.SetCursorPosition(0, j);
                        Console.Write($"┃                               {emoji}   Bingo Game   {emoji}                           ┃");
                        continue;
                    }
                    Console.SetCursorPosition(0, j);
                    Console.Write("┃                                                                              ┃");
                }
                Console.Write("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");
                Thread.Sleep(500);
                Console.Clear();
            }

            Random rand = new Random();
            var isPlaying = true;
            var bingo = 0;

            bool[] rowChecked = new bool[5];
            bool[] columnChecked = new bool[5];
            bool rightDiagonalChecked = false;
            bool leftDiagonalChecked = false;

            int[,] nums = new int[5, 5];
            for (int i = 0; i < 5; i++)
            {
                for (int j = 0; j < 5; j++)
                {
                    nums[i, j] = i * 5 + j + 1;
                }
            }

            // 빙고판 출력
            PrintBingo(nums);
            Thread.Sleep(1000);
            Console.Clear();

            Console.WriteLine("카드를 섞는 중입니다... ⏳");

            // 셔플
            for (int i = 0; i < 100; i++)
            {
                int iA = rand.Next(0, 5);
                int jA = rand.Next(0, 5);
                int iB = rand.Next(0, 5);
                int jB = rand.Next(0, 5);

                // swap
                int temp = nums[iA, jA];
                nums[iA, jA] = nums[iB, jB];
                nums[iB, jB] = temp;

                PrintBingo(nums);
                Thread.Sleep(5);
            }

            Console.Clear();

            while (true)
            {
                Console.Clear();
                Console.SetCursorPosition(0, 0);
                Console.WriteLine($"현재 빙고 : {bingo}");
                PrintBingo(nums);

                Console.Write("\\n숫자를 입력하세요 (1 ~ 25): ");
                var input = int.Parse(Console.ReadLine());

                // 선택한 숫자를 0으로 변경
                for (int i = 0; i < 5; i++)
                {
                    for (int j = 0; j < 5; j++)
                    {
                        if (nums[i, j] == input)
                        {
                            nums[i, j] = 0;
                            break;
                        }
                    }
                }

                PrintBingo(nums);

                // 가로 체크
                for (int i = 0; i < 5; i++)
                {
                    if (!rowChecked[i] && CheckRowBingo(nums, i))
                    {
                        bingo++;
                        rowChecked[i] = true;
                    }
                }

                // 세로 체크
                for (int i = 0; i < 5; i++)
                {
                    if (!columnChecked[i] && CheckColumnBingo(nums, i))
                    {
                        bingo++;
                        columnChecked[i] = true;
                    }
                }

                // 대각선 체크
                if (!rightDiagonalChecked && CheckRightDiagonalBingo(nums))
                {
                    bingo++;
                    rightDiagonalChecked = true;
                }

                if (!leftDiagonalChecked && CheckLeftDiagonalBingo(nums))
                {
                    bingo++;
                    leftDiagonalChecked = true;
                }

                if (bingo >= 12)
                {
                    Console.Clear();
                    Console.WriteLine("모든 빙고를 달성했습니다! 💫");
                    PrintCompleteBingo();
                    Environment.Exit(0);
                }
            }
        }

        static void PrintBingo(int[,] array)
        {
            Console.SetCursorPosition(0, 1);
            for (int i = 0; i < 5; i++)
            {
                for (int j = 0; j < 5; j++)
                {
                    if (array[i, j] == 0)
                    {
                        Console.Write("🌟 "); // 0일 경우 체크
                    }
                    else
                    {
                        Console.Write($"{array[i, j].ToString("D2")} ");
                    }
                }
                Console.WriteLine();
            }
        }

        static void PrintCompleteBingo()
        {
            Console.SetCursorPosition(0, 1);

            var cnt = 0;
            while (true)
            {
                if (cnt >= 25)
                {
                    break;
                }

                Console.SetCursorPosition(0, 1);

                for (int i = 0; i < 5; i++)
                {
                    for (int j = 0; j < 5; j++)
                    {
                        if (i * 5 + j <= cnt)
                        {
                            Console.Write("❤🔥 ");
                        }
                        else
                        {
                            Console.Write("🌟 ");
                        }
                    }
                    Console.WriteLine();
                }

                Thread.Sleep(10);
                cnt++;
            }
        }

        static bool CheckRowBingo(int[,] array, int row) // 가로 체크
        {
            for (int j = 0; j < 5; j++)
            {
                if (array[row, j] != 0)
                {
                    return false;
                }
            }
            return true;
        }

        static bool CheckColumnBingo(int[,] array, int column) // 세로 체크
        {
            for (int j = 0; j < 5; j++)
            {
                if (array[j, column] != 0)
                {
                    return false;
                }
            }
            return true;
        }

        static bool CheckRightDiagonalBingo(int[,] array)
        {
            for (int i = 0; i < 5; i++)
            {
                if (array[i, 4 - i] != 0)
                {
                    return false;
                }
            }
            return true;
        }

        static bool CheckLeftDiagonalBingo(int[,] array)
        {
            for (int i = 0; i < 5; i++)
            {
                if (array[i, i] != 0)
                {
                    return false;
                }
            }
            return true;
        }
    }
}

💫 Tip!

[C#] 소수점 자리수 찍기

double value = 123.456789;
Console.WriteLine(value.ToString("F2")); // 123.46
Console.WriteLine($"소수점 둘째자리 : {value:F2}"); // 소수점 둘째자리 : 123.46

[C#] 솟자에 콤마(,) 찍기

int num1 = 123456789;
double num2 = 98765.4321;

Console.WriteLine(num1.ToString("N0"));  // 123,456,789
Console.WriteLine(num2.ToString("N2"));  // 98,765.43 (콤마와 자리수 한 번)

[C#] 배열 요소를 출력하는 함수

static void Print2DArray(int[,] array)
{
    for (int i = 0; i < array.GetLength(0); i++)
    {
        for (int j = 0; j < array.GetLength(1); j++)
        {
            Console.Write($"{array[i, j]} ");
        }
        Console.WriteLine();
    }
}

static void PrintArray(int[] array)
{
    foreach (var num in array)
    {
        Console.Write($"{num} ");
    }
    Console.WriteLine();
}

static void PrintStringArray(string[] array)
{
    string result = string.Join(" ", array);
    Console.WriteLine(result);
}

C#은 배열 요소를 출력해주는 기본 함수가 제공되지 않는다

[C#] 튜플로 값 교환하기

int a = rand.Next(25);
int b = rand.Next(25);

(nums[a], nums[b]) = (nums[b], nums[a]);

📝 과제

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AssingmentDay5
{
    class Program
    {
        static void Main(string[] args)
        {
            // 배열
            Console.WriteLine("========= 배열 =========");
            Console.WriteLine(" - 문제1");
            int[] nums = { 10, 20, 30, 40, 50 };
            PinrtIntArray(nums);

            Console.WriteLine("\\n - 문제2");
            Console.Write("숫자 5개를 공백으로 구분해 입력해 주세요: ");
            string input = Console.ReadLine();
            int[] nums2 = StringToIntArray(input);
            Console.WriteLine($"배열의 합은 {MySum(nums2)} 입니다.");

            Console.WriteLine("\\n - 문제3");
            int[] nums3 = { 3, 8, 15, 6, 2 };
            Console.WriteLine($"배열 요소의 최댓값은 {MyMax(nums3)} 입니다.");

            Console.WriteLine("\\n\\n========= 반복문 =========");
            Console.WriteLine(" - 문제4");
            for(int i=1; i<=10; i++)
            {
                Console.Write($"{i} ");
            }
            Console.WriteLine();

            Console.WriteLine("\\n - 문제5");
            var cnt = 1;
            while (true)
            {
                if (cnt > 10)
                {
                    break;
                }

                if (cnt % 2 == 0)
                {
                    Console.Write($"{cnt} ");
                }

                cnt++;
            }
            Console.WriteLine();

            Console.WriteLine("\\n - 문제6");
            int[] nums4 = { 1, 2, 3, 4, 5 };
            foreach(var num in nums4)
            {
                Console.Write($"{num} ");
            }
            Console.WriteLine();

            Console.WriteLine("\\n\\n========= 함수 =========");
            Console.WriteLine("- 문제7");
            Console.Write("숫자 2개를 공백으로 구분해 입력해 주세요: ");
            string input2 = Console.ReadLine();
            var nums5 = StringToIntArray(input2);
            var n1 = nums5[0];
            var n2 = nums5[1];
            Console.WriteLine($"{n1}과 {n2}의 합 : {MySum(n1, n2)}");

            Console.WriteLine("\\n - 문제8");
            Console.Write("문자열을 입력해 주세요: ");
            string input3 = Console.ReadLine();
            Console.WriteLine($"문자열의 길이 : {MyArrayLength(input3)}");

            Console.WriteLine("\\n - 문제9");
            Console.Write("숫자 3개를 공백으로 구분해 입력해 주세요: ");
            string input4 = Console.ReadLine();
            var nums6 = StringToIntArray(input4);
            var n3 = nums6[0];
            var n4 = nums6[1];
            var n5 = nums6[2];
            Console.WriteLine($"가장 큰 수 : {MyMax(n3, n4, n5)}");
        }

        static void PinrtIntArray(int[] arr)
        {
            foreach(var num in arr)
            {
                Console.Write($"{num} ");
            }
            Console.WriteLine();
        }

        static int[] StringToIntArray(string str)
        {
            int[] nums = str.Split(' ')
                .Select(int.Parse)
                .ToArray();

            return nums;
        }

        static int MySum(int[] arr)
        {
            var sum = 0;
            foreach (var num in arr)
            {
                sum += num;
            }
            return sum;
        }

        static int MyMax(int[] arr)
        {
            var curMax = arr[0];

            foreach (var num in arr)
            {
                if (num > curMax)
                {
                    curMax = num;
                }
            }

            return curMax;
        }

        static int MySum(int n1, int n2)
        {
            return n1 + n2;
        }

        static int MyArrayLength(string str)
        {
            var len = 0;
            foreach(char c in str)
            {
                len++;
            }
            return len;
        }

        static int MyMax(int n1, int n2, int n3)
        {
            var curMax = n1;

            if (n2 > curMax)
            {
                curMax = n2;
            }

            if (n3 > curMax)
            {
                curMax = n3;
            }

            return curMax;
        }
    }
}

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함