본문 바로가기

내일배움캠프/사전캠프 TIL

[TIL] C# 문법 학습

이번 시간에는 c# 문법에 대해 학습해보고 이에 관한 과제를 수행해보자.

 


Lv1. 기초 문법 파헤치기

 

1. 홀수 출력

 

⦁ 1부터 100까지 숫자 중에서 홀수만 출력하는 프로그램을 작성하세요.

 1. for 문을 사용해 홀수를 출력해주세요.

 2. while 문을 사용해 홀수를 출력해주세요.

 3. do-while 문을 사용해 홀수를 출력해수세요.

 

using System;

class 홀수출력
{
    private static int num = 100;

    public static void Main()
    {
        //Method1();
        //Method2();
        //Method3();
    }

    // 01 for문을 사용해 홀수를 출력해주세요.
    public static void Method1()
    {
        for(int i=1; i<=num; i++)
        {
            if(i%2==1) Console.WriteLine(i);
        }
    }

    // 02 while문을 사용해 홀수를 출력해주세요
    public static void Method2()
    {
        int i=1;
        while(i<=num)
        {
            if(i%2==1) Console.WriteLine(i);
            i++;
        }
    }

    // 03 do-while문을 사용해 홀수를 출력해주세요
    public static void Method3()
    {
        int i=1;
        do
        {
            if(i%2==1) Console.WriteLine(i);
            i++;
        }
        while(i<=num);
    }
}

 

출력 결과)

 

풀이 후기)

- 기본 문법인 만큼 어렵지 않았다.

 

 

2. 배열을 사용한 합계 및 평균 계산

 

⦁ 주어진 숫자 배열의 합계와 평균을 계산하는 프로그램을 작성하세요.

 

using System;
using System.Collections.Generic;
using System.Numerics;

class 평균계산
{
    private static List<int> nums = new List<int> { 10, 20, 30, 40, 50 };

    public static void Main()
    {
        Console.WriteLine("Sum: " + CaculateSum(nums).ToString());
        Console.WriteLine("Average: " + CaculateAverage(nums).ToString());
    }

    // 합 계산
    public static int CaculateSum(List<int> nums)
    {
        int sum = 0;
        foreach(int num in nums) sum += num;
        return sum;
    }

    // 평균 계산
    public static int CaculateAverage(List<int> nums)
    {
        int avg = 0;
        avg = CaculateSum(nums) / nums.Count;
        return avg;
    }
}

 

출력 결과)

 

풀이 후기)

- 합과 평균 또한 간단한 계산이기 때문에 금방 풀이했다.

 

 


 

Lv2. 기초 문법 활용해보기

 

3. 펙토리얼 계산

 

⦁ 사용자로부터 입력받은 숫자의 팩토리얼을 계산하는 프로그램을 작성하세요.

 1. 팩토리얼은 n!로 표현되며, n! = n × (n-1) × (n-2) × ... × 1입니다.

 2. 예를 들어, 5! = 5 × 4 × 3 × 2 × 1 = 120입니다.

 3. for, while, do-while 문 중 하나를 활용하여 해결해주세요.

 4. Console.ReadLind() 을 활용해서 출력 값을 출력해주세요.

 

using System;

class 팩토리얼계산
{
    private static int num = 100;

    public static void Main()
    {
        Input();
        Output();
    }

    public static void Input()
    {
        Console.Write("Enter a number : ");
        num = int.Parse(Console.ReadLine());
    }

    public static void Output()
    {
        int result = 1;
        for(int i=num; i>0; i--)
        {
            result *= i;
        }
        Console.Write("Factorial of " + num + " is " + result);
    }
}

 

출력 결과)

 

풀이 후기)

- Console.ReadLind()을 활용하진 않았지만 팩토리얼 계산식을 for문을 활용하여 문제를 해결하였다.

 

 

4. 숫자 맞추기 게임

 

⦁ 숫자 맞추기 게임을 작성하세요. 컴퓨터가 1부터 100 사이의 숫자를 선택하면 그 숫자를 맞추는 게임을 구현하세요. 사용자가 숫자를 입력하면 컴퓨터는 숫자가 더 크거나 작은지 힌트를 줍니다. 맞출 때까지 반복합니다.

 

using System;

class 숫자맞추기게임
{
    private static int numMax = 100;
    private static int answer = 0;
    private static int num = 0;

    public static void Main()
    {
        Init();
        while(true)
        {
            num = Input();
            if(Output(num)==true) break;
        }
    }

    // 01 게임 초기화: 컴퓨터가 랜덤한 값으로 숫자 정하기
    public static void Init()
    {
        Random rang = new Random();
        answer = rang.Next(1, numMax+1);
        Console.WriteLine(answer);
    }

    // 02 사용자로부터 숫자 받기
    public static int Input()
    {
        Console.Write("Enter your guess (1-" + numMax + "): ");
        return int.Parse(Console.ReadLine());
    }

    // 03 받은 숫자를 판단해 정답 체크
    public static bool Output(int num)
    {
        if(num==answer)
        {
            Console.WriteLine("Congratulations! You guessed the number.");
            return true;
        }
        else if(num>answer)
        {
            Console.WriteLine("Too high! Try again.");
        }
        else
        {
            Console.WriteLine("Too low! Try again.");
        }

        return false;
    }
}

 

출력 결과)

 

풀이 후기)

-  사용자의 입력을 받고 그 입력값을 int로 변환하여 판단하는 문법을 활용해봤다. if 삼중조건문을 활용하여 간단하게 해결하였다.

 

 

5. 이중 반복문을 사용한 구구단 출력

 

⦁ 이중 반복문을 사용하여 2단부터 9단까지의 구구단을 출력하는 프로그램을 작성하세요. 각 단은 1부터 9까지 곱하여 결과를 출력해야 합니다.

 1. 구구단 세로로 출력해 주세요

 2. 구구단 가로로 출력해 주세요

 

using System;

class 구구단출력
{
    public static void Main()
    {
        Output1();
        Output2();
    }

    // 세로로 출력
    public static void Output1()
    {
        Console.WriteLine("구구단 세로로 출력");
        // 2부터 9까지 구구단 출력
        for(int i=1; i<=9; i++)
        {
            // 1부터 9까지 곱한 결과를 출력
            for(int j=2; j<=9; j++)
            {
                Console.Write(j + " x " + i + " = " + i*j + " ");
            }
            Console.WriteLine("\n");
        }
    }

    // 가로로 출력
    public static void Output2()
    {
        Console.WriteLine("구구단 가로로 출력");
        // 2부터 9까지 구구단 출력
        for(int i=2; i<=9; i++)
        {
            // 1부터 9까지 곱한 결과를 출력
            for(int j=1; j<=9; j++)
            {
                Console.Write(i + " x " + j + " = " + i*j + " ");
            }
            Console.WriteLine("\n");
        }
    }
}

 

출력 결과)

 

풀이 후기)

- 가로로 출력하는 건 쉬웠지만 세로로 출력하는 방법을 잠시나마 고민하였지만 쉽게 풀이할 수 있었다.

 

 

6. 배열 요소의 최대값과 최소값 찾기

 

⦁ int[] numbers = { 10, 20, 30, 40, 50 }; 이와 같이 주어진 숫자 배열에서 최대값과 최소값을 찾는 프로그램을 작성하세요.

 1. Console.WriteLine();을 사용해 최대값과 최소값을 각각 출력할 수 있습니다.

 

using System;

class 최대값과최소값
{
    private static int[] numbers = { 10, 20, 30, 40, 50 };
    private static int max = 0;
    private static int min = int.MaxValue;

    public static void Main()
    {
        Output(numbers);
    }

    public static void Output(int[] numbers)
    {
        // 최댓값 최솟값 찾기
        for(int i=0; i<numbers.Length; i++)
        {
            max = (max < numbers[i]) ? numbers[i] : max;
            min = (min > numbers[i]) ? numbers[i] : min;
        }

        Console.WriteLine("최댓값: " + max);
        Console.WriteLine("최솟값: " + min);
    }
}

 

출력 결과)

 

풀이 후기)

- 코드 길이를 줄이기 위해 조건부 연산자를 이용하여 최대값과 최소값을 구할 수 있었고 각각 따로 출력하였다.

 


Lv3. 팀원과 함께해요

 

7. 행맨 게임

 

⦁ 사용자로부터 문자를 입력받아 숨겨진 단어를 맞추는 행맨 게임을 작성하세요. 사용자가 단어의 모든 문자를 맞추거나 주어진 기회 내에 맞추지 못할때 까지 반복합니다.

게임 설명: 행맨 게임은 사용자가 단어를 추측하는 게임입니다.용자는 알파벳을 하나씩 입력하고, 맞출 때마다 단어의 해당 위치에 문자가 표시됩니다. 틀릴 경우, 기회가 줄어듭니다.

배열 사용: char[] 배열을 사용하여 단어를 저장하고, 추측된 문자를 저장합니다.

반복문 사용:임은 사용자가 단어를 맞추거나 기회가 끝날 때까지 반복됩니다.

조건문 사용: 각 입력된 문자가 단어에 포함되는지 확인합니다.

 

사용 변수 설명

secretWord: 맞춰야 할 단어입니다. 예제에서는 "hangman"으로 설정되어 있습니다.

 guessWord: 사용자가 맞춘 문자를 저장하는 문자 배열로, 초기에는 언더스코어(_)로 채워져 있습니다.

attempts:  사용자가 틀릴 수 있는 기회의 수로, 초기에는 6으로 설정되어 있습니다.

wordGussed: 사용자가 단어를 모두 맞췄는지를 나타내는 불리언 변수입니다.

 

using System;

class 행맨게임
{
    // 게임 변수
    private static char[] words;
    private static string secretWord;
    private static string guessWord;
    private static int attempts;
    private static bool wordGuessed;


    public static void Main()
    {
        Init();
        while(true)
        {
            if(Input()==false) continue;
            if(Output()==true) break;
        }
    }


    // 게임 초기화
    private static void Init()
    {
        secretWord = "hangman";
        words = new char[secretWord.Length];
        for (int i = 0; i < words.Length; i++) words[i] = '*';
        guessWord = "_";
        attempts = 6;
        wordGuessed = false;
    }

    // 사용자 입력
    private static bool Input()
    {
        Console.Write("알파벳을 입력해주세요: ");
        guessWord = Console.ReadLine();

        // 알파벳을 입력했는지 확인
        if(string.IsNullOrEmpty(guessWord) || guessWord.Length != 1)
        {
            Console.WriteLine("한글자만 입력해주세요!");
            return false;
        }

        // 숫자를 입력했는지 확인
        if(char.IsDigit(guessWord[0]))
        {
            Console.WriteLine("숫자는 입력할 수 없습니다!");
            return false;
        }

        return true;
    }

    // 결과
    private static bool Output()
    {
        bool isTrue = false;

        // 정답에서 맞는 알파벳이 있는지 확인
        for(int i=0; i<secretWord.Length; i++)
        {
            if(secretWord[i].ToString() == guessWord)
            {
                // 중첩되는 알파벳 체크
                if(words[i]==secretWord[i]) continue;

                words[i] = secretWord[i]; 
                isTrue = true;

                break;
            }
        }

        // 모두 정답을 맞췄는지 확인
        wordGuessed = true;
        for(int i = 0; i < secretWord.Length; i++)
        {
            if(words[i] != secretWord[i])
            {
                wordGuessed = false;
                break;
            }
        }

        if(isTrue)
        {
            Console.WriteLine("맞췄습니다!");

            if(wordGuessed)
            {
                Console.WriteLine("정답을 맞췄습니다! 정답 : " + secretWord);
                return true;
            }
        }
        else
        {
            attempts--;
            Console.WriteLine("틀렸습니다!");

            if(attempts <= 0)
            {
                Console.WriteLine("현재 맞출 수 있는 기회: " + attempts);
                Console.WriteLine("결국 못맞췄습니다! 게임종료!");
                Console.WriteLine("정답은 " + secretWord + "였습니다!");
                return true;
            }
        }

        Console.WriteLine("현재 추측 단어: " + new string(words));
        Console.WriteLine("현재 맞출 수 있는 기회: " + attempts);

        return false;
    }
}

 

출력 결과)

풀이 후기)

- 이제 보니 (_) 언더바로 채워져 있는것을 *로 대체한것 같다. 주어진 정답에서 정답을 맞출경우 그 정답 맞은 알파벳과 자리수를 보여주기 위하여 *에서 알파벳으로 변경하는 작업을 진행하였고 총 6번째 기회를 주는 형식으로 진행하였다.

 

문제 풀이를 하다가 문제가 발생하였습니다. hangman의 a가 2번 중첩되어 a를 2번째 입력했을때 5번째 a가 변경되지 않은 문제를 발견했다. 이를 해결하기 위해 중첩되는 알파벳 체크를 하여 예외처리를 하였고 이 문제를 해결할 수 있었다.

 

이후 secretWord는 단어 리스트에서 아무거나 뽑아도 게임이 진행될 수 있도록 게임을 전체적으로 설계하였다.

하지만 Console.WriteLine()의 함수 쓰임이 많아 최적화 할 필요는 있을거 같다.

 

 

8. 숫자 야구 게임

 

⦁ 숫자 야구 게임을 작성하세요. 컴퓨터가 3자리 숫자를 선택하면 사용자가 그 숫자를 맞추는 게임을 구현하세요. 각 자리의 숫자를 비교하여 스트라이크와 볼의 개수를 출력합니다.

 

숫자 야구 게임 설명: 

 숫자 야구 게임은 3자리의 숫자를 맞추는 게임입니다. 컴퓨터가 고른 3자리 숫자는 모두 다른 숫자로 이루어져 있습니다. 사용자는

 3자리 숫자를 입력하고, 컴퓨터는 입력한 숫자와 자리수를 비교하여 스트라이크와 볼의 개수를 알려줍니다

스트라이크 : 숫자와 자리수가 모두 맞는 경우

볼: 숫자는 맞지만 자리수가 다른 경우

 

예를 들어, 컴퓨터가 427을 선택하고 사용자가 123을 입력했을 때, 2는 맞지만 자리수가 다르므로 1볼, 1은 맞지 않으므로 0스트라이크입니다. 이 과정은 사용자가 정확한 숫자를 맞출 때까지 반복됩니다.

 

사용 변수 설명

targetNumber: 컴퓨터가 선택한 3자리의 숫자를 저장하는 배열입니다.

 userGuess: 사용자가 추측한 숫자를 저장하는 배열입니다.

 strikes:  자릿수와 숫자가 모두 맞는 경우의 개수를 저장합니다.

 balls: 자릿수는 맞지 않지만 숫자가 포함된 경우의 개수를 저장합니다.

 guessedCorrectly: 사용자가 숫자를 정확히 맞췄는지를 나타내는 불리언 변수입니다.

 

using System;

class 숫자야구게임
{
    // 게임 변수
    private static int[] targetNumber;
    private static string userGuess;
    private static int strikes;
    private static int balls;
    private static bool guessedCorrectly;
    private static int attempts;


    public static void Main()
    {
        Init();
        while(true)
        {
            if(Input()==false) continue;
            Output();

            if(guessedCorrectly) break;
        }
    }


    // 게임 초기화
    private static void Init()
    {
        targetNumber = new int[]{9, 8, 7};
        strikes = 0;
        balls = 0;
        attempts = 1;
        guessedCorrectly = false;
    }

    // 사용자 입력
    private static bool Input()
    {
        Console.Write("Enter your guess (3 digits): ");
        userGuess = Console.ReadLine();

        // 예외처리
        // 알파벳을 입력했는지 확인
        if(string.IsNullOrEmpty(userGuess) || userGuess.Length != 3)
        {
            Console.WriteLine("똑바로 입력해주세요! 숫자 3개를 연달아서");
            return false;
        }

        // 숫자를 입력했는지 확인
        if(!char.IsDigit(userGuess[0]) || !char.IsDigit(userGuess[1]) || !char.IsDigit(userGuess[2]))
        {
            Console.WriteLine("숫자를 입력해주세요!");
            return false;
        }

        return true;
    }

    private static void Output()
    {
        // 변수 초기화
        strikes = 0;
        balls = 0;

        for(int i=0; i<userGuess.Length; i++)
        {
            for(int j=0; j<targetNumber.Length; j++)
            {
                if(targetNumber[j] == int.Parse(userGuess[i].ToString()))
                {
                    if(i==j) 
                    {
                        // 자릿수와 숫자 모두 맞는 경우
                        strikes++;
                        break;
                    }
                    else
                    {
                        // 자릿수는 맞지 않지만 숫자가 포함된 경우
                        balls++;
                        break;
                    }
                }
            }
        }

        Console.WriteLine(strikes + " Strike(s), " + balls + " Ball(s)");

        if(strikes==3)
        {
            Console.WriteLine("Congratulations! You've guessed the number in " + attempts + " attempts.");
            guessedCorrectly = true;
        }
        else
        {
            attempts++;
        }
    }
}

 

출력 결과)

 

풀이 후기)

- 7번째 행맨 게임을 풀고 난 이후에는 시스템이 비슷해서 크게 어렵진 않았다. 다만 자릿수와 숫자 모두 맞는 경우 strikes 변수를 먼저 확인하고 ball을 확인해야 3개의 o/x 문제가 해결되어 이점만 주의하였다.

 

 


학습 후기)

- Lv3 부터 난이도가 올라가 30분정도 시간을 소요한것 같다. 아직 알고리즘적으로 코드가 클린하거나 최적화 문제가 있는 것 같다. 나중에 기회가 있으면 코드를 검수 받아 이를 해결해보고 싶다.