[BAEKJOON] 백준 2511: 카드놀이 (C#)

2024. 5. 30. 16:40IT/BaekJoon

문제 링크

https://www.acmicpc.net/problem/2511

 

 

문제

0부터 9까지의 숫자가 표시된 카드를 가지고 두 사람 A와 B가 게임을 한다. A와 B에게는 각각 0에서 9까지의 숫자가 하나씩 표시된 10장의 카드뭉치가 주어진다. 두 사람은 카드를 임의의 순서로 섞은 후 숫자가 보이지 않게 일렬로 늘어  놓고 게임을 시작한다. 단, 게임 도중 카드의 순서를 바꿀 수는 없다.

A와 B 각각이 늘어놓은 카드를 뒤집어서 표시된 숫자를 확인하는 것을 한 라운드라고 한다. 게임은 첫 번째 놓인 카드부터 시작하여 순서대로 10번의 라운드로 진행된다. 각 라운드에서는 공개된 숫자가 더 큰 사람이 승자가 된다. 승자에게는 승점 3점이 주어지고 패자에게는 승점이 주어지지 않는다. 만약 공개된 두 숫자가 같아서 비기게 되면, A, B 모두에게 승점 1점이 주어진다. 

10번의 라운드가 모두 진행된 후, 총 승점이 큰 사람이 게임의 승자가 된다. 만약, A와 B의 총 승점이 같은 경우에는, 제일 마지막에 이긴 사람을 게임의 승자로 정한다. 그래도 승부가 나지 않는 경우는 모든 라운드에서 비기는 경우뿐이고 이 경우에 두 사람은 비겼다고 한다.

예를 들어, 다음 표에서 3번째 줄은 각 라운드의 승자를 표시하고 있다. 표에서 D는 무승부를 나타낸다. 이 경우에 A의 총 승점은 16점이고, B는 13점이어서, A가 게임의 승자가 된다. 

아래 표의 경우에는 A와 B의 총 승점은 13점으로 같다. 마지막으로 승부가 난 라운드는 7번째 라운드이고, 이 라운드의 승자인 B가 게임의 승자가 된다. 

A와 B가 늘어놓은 카드의 숫자가 순서대로 주어질 때, 게임의 승자가 A인지 B인지, 또는 비겼는지 결정하는 프로그램을 작성하시오.

 

 

입력

입력 파일은 두 개의 줄로 이루어진다. 첫 번째 줄에는 A가 늘어놓은 카드의 숫자들이 빈칸을 사이에 두고 순서대로 주어진다. 두 번째 줄에는 B가 늘어놓은 카드의 숫자들이 빈칸을 사이에 두고 순서대로 주어진다. 

 

 

출력

첫 번째 줄에는 게임이 끝난 후, A와 B가 받은 총 승점을 순서대로 빈칸을 사이에 두고 출력한다. 두 번째 줄에는 이긴 사람이 A인지 B인지 결정해서, 이긴 사람을 문자 A 또는 B로 출력한다. 만약 비기는 경우에는 문자 D를 출력한다. 

 

 

 

통과한 답안

namespace _2511
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int[] ACards = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
            int[] BCards = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();

            int AScore = 0;
            int BScore = 0;
            char lastWinner = 'D';

            for (int i = 0; i < ACards.Length; i++)
            {
                if (ACards[i] > BCards[i])
                {
                    AScore += 3;
                    lastWinner = 'A';
                }
                else if (ACards[i] == BCards[i])
                {
                    AScore++;
                    BScore++;
                }
                else
                {
                    BScore += 3;
                    lastWinner = 'B';
                }
            }

            if (AScore > BScore)
            {
                lastWinner = 'A';
            }
            else if (AScore < BScore)
            {
                lastWinner = 'B';
            }

            Console.WriteLine($"{AScore} {BScore}");
            Console.WriteLine(lastWinner);
        }
    }
}

 

A와 B에게 0부터 9까지 주어진 10장을 카드를 한 장씩 사용하여 비교하여

카드의 숫자가 더 높은 사람이 3점을 얻고, 숫자가 같다면 1점씩 얻을 경우

최종 점수와 승자를 찾는 문제이다.

 

일반적인 카드 게임의 구현법으로 각 라운드 마다 카드를 비교하고

승점을 주는 방식으로 코드를 작성했다.

단, 이 문제에서 총 승점이 같은 경우에는 제일 마지막에 이긴 사람이 승자가 되므로

lastWinner를 추가하여 라운드마다 승자를 기록한다.

또, 모든 라운드에서 비긴다면 무승부를 표시해야되므로

lastWinner의 시작은 D로 시작하였다.

 

모든 라운드의 판정이 종료된 후에

A와 B의 총점을 비교하여 승자를 결정하고,

총점이 같은 경우에는 마지막에 이긴 사람을 승자로 출력하게 구현하였다.