C# 코딩테스트 강좌, 카드 게임

안녕하세요! 이번 포스팅에서는 C#을 이용한 알고리즘 코딩 테스트 문제 중 하나인 카드 게임 문제를 다루어 보겠습니다. 알고리즘 문제를 해결하는 과정에서 필요한 개념들 및 접근 방식을 상세하게 설명하도록 하겠습니다.

문제 설명

당신은 두 플레이어(A와 B)가 진행하는 카드 게임을 설계하고 있습니다. 카드 덱은 1부터 N까지의 숫자가 적힌 카드들로 이루어져 있습니다. 각 플레이어는 고유한 카드 세트를 가지고 있으며, 각 세트는 모두 고유한 카드로 구성되어 있습니다. 게임의 규칙은 다음과 같습니다:

  • 두 플레이어는 각자의 카드 중에서 하나를 선택합니다.
  • 두 카드의 숫자를 비교하여 큰 카드의 소유자가 승리합니다.
  • 동점일 경우, 플레이어 A가 승리합니다.

플레이어 A와 B의 카드 리스트가 주어질 때, 각 라운드의 승자를 결정하고 최종적으로 승자가 누구인지 출력하는 프로그램을 작성하세요.

입력 형식

입력은 다음과 같습니다:

  • 첫 번째 줄에는 카드의 개수 N (N은 1 ≤ N ≤ 1000)이 주어집니다.
  • 두 번째 줄에는 플레이어 A의 카드 리스트가 공백으로 구분되어 주어집니다.
  • 세 번째 줄에는 플레이어 B의 카드 리스트가 공백으로 구분되어 주어집니다.

출력 형식

각 라운드의 승자를 출력한 후, 최종 승자가 누구인지 출력합니다. 예를 들어:

    "A" (A의 카드, B의 카드)
    "B" (A의 카드, B의 카드)
    "A" (A의 카드, B의 카드)
    => 최종 승자: A
    

예제 입력

5
2 3 5 1 4
6 4 2 5 3
    

예제 출력

B (2, 6)
A (3, 4)
A (5, 2)
A (1, 5)
B (4, 3)
=> 최종 승자: A
    

문제 분석 및 접근 방법

이 문제를 해결하기 위해 우리는 반복문을 사용하여 각 라운드에서 카드의 숫자를 비교해야 합니다. 그 원리는 간단합니다:

  1. 입력으로 받은 플레이어 A와 B의 카드 리스트를 순서대로 비교합니다.
  2. 각 카드 쌍(플레이어 A의 카드, 플레이어 B의 카드)을 비교하여 승자를 결정합니다.
  3. 승자를 출력하고, 카운트를 통해 최종 승자를 결정합니다.

C# 코드 구현


using System;
using System.Linq;

class CardGame
{
    static void Main()
    {
        // 카드 수 입력
        int N = int.Parse(Console.ReadLine());
        
        // 플레이어 A의 카드 입력
        int[] playerA = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
        
        // 플레이어 B의 카드 입력
        int[] playerB = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
        
        // 플레이어 승리 카운트
        int scoreA = 0, scoreB = 0;

        // 각 라운드 진행
        for (int i = 0; i < N; i++)
        {
            // 각 플레이어의 카드
            int cardA = playerA[i];
            int cardB = playerB[i];

            // 승자 결정
            if (cardA > cardB)
            {
                Console.WriteLine($"A ({cardA}, {cardB})");
                scoreA++;
            }
            else if (cardB > cardA)
            {
                Console.WriteLine($"B ({cardA}, {cardB})");
                scoreB++;
            }
            else
            {
                Console.WriteLine($"A ({cardA}, {cardB})");
                scoreA++; // 동점일 경우 A 승
            }
        }

        // 최종 승자 결정
        Console.WriteLine($"=> 최종 승자: {(scoreA >= scoreB ? "A" : "B")}");
    }
}

문제 해결 과정

이제 문제 해결 과정을 단계별로 살펴보겠습니다.

1단계: 입력 읽기

우선, 사용자의 입력을 통해 카드의 개수와 플레이어 A, B의 카드 리스트를 읽었습니다. C#에서는 Console.ReadLine() 메서드를 사용하여 문자열로 입력을 받습니다. 입력 받은 문자열을 Split() 메서드를 사용하여 공백으로 분리하고, int.Parse() 메서드를 활용해 정수 배열로 변환했습니다.

2단계: 카드 비교 및 승자 결정

각 라운드를 반복문을 통해 처리했습니다. 플레이어 A와 B의 카드를 비교하고, 승자를 결정하여 출력했습니다. 승자 결정에서는 간단한 조건문을 통해 카드를 비교했습니다.

3단계: 최종 승자 출력

각 라운드 종료 후 승리 카운트를 업데이트하고, 모든 라운드가 끝난 후 최종 승자를 출력했습니다. 이 과정에서도 조건문을 사용하여 최종 점수를 비교했습니다.

복잡도 분석

이 문제의 시간 복잡도는 O(N)으로, N은 카드의 개수입니다. 입력으로 주어진 카드 리스트를 한 번씩만 확인하기 때문입니다. 공간 복잡도 또한 O(N)으로, 카드 리스트를 저장하기 위해 사용할 메모리 양이 카드의 개수 N에 비례하기 때문입니다.

추가적인 팁

이번 문제를 해결하면서 기본적인 알고리즘 사고를 발전시키는 것이 중요합니다. 다음과 같은 팁을 통해 알고리즘 문제 해결 능력을 키울 수 있습니다:

  • 문제의 조건을 명확히 이해하고, 예제를 통해 다양한 경우를 시뮬레이션 해보세요.
  • 코드를 작성하기 전에 알고리즘의 흐름을 주석으로 남기는 습관을 기르세요.
  • 풀이한 문제들을 다양한 방법으로 해결해보려는 노력을 해보세요. 같은 문제라도 다른 풀이가 있을 수 있습니다.

마치며

C#을 활용한 알고리즘 문제를 해결하는 것은 다양한 사고력과 문제 해결 능력을 기르는 데 큰 도움이 됩니다. 이번 포스팅에서 다룬 카드 게임 문제를 통해 다음 단계로 나아갈 수 있는 기회가 되길 바랍니다. 더 많은 알고리즘 문제와 해결책을 공유할 예정이니, 많은 관심 부탁드립니다!