티스토리 뷰
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;
}
}
}
'Unity > 멋쟁이사자처럼' 카테고리의 다른 글
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 9일차 회고 (0) | 2025.03.07 |
---|---|
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 8일차 회고 (0) | 2025.03.07 |
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 7일차 회고 (0) | 2025.03.07 |
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 6일차 회고 (0) | 2025.03.07 |
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 4일차 회고 (0) | 2025.03.07 |