[BAEKJOON] 백준 1357: 세준세비 (C#)

2024. 5. 20. 15:40IT/BaekJoon

문제 링크

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

 

 

문제

세준이와 세비는 온라인 게임을 즐겨한다. 이 온라인 게임에서는 군대를 서로 키울 수 있다. 세준이는 N명의 병사를 키웠고, 세비는 M명의 병사를 키웠다.

이제 서로 전쟁을 하려고 한다.

전쟁은 여러 번의 전투로 이루어진다. 각 전투에서 살아있는 병사중 제일 약한 병사가 죽는다. 만약 제일 약한 병사가 여러 명이고, 제일 약한 병사가 모두 같은 편에 있다면, 그 중에 한 명이 임의로 선택되어 죽는다. 하지만, 제일 약한 병사가 여러 명이고, 양 편에 모두 있다면, 세비의 제일 약한 병사 중 한 명이 임의로 선택되어 죽는다.

전쟁은 한 명의 병사를 제외하고 모두 죽었을 때 끝난다. 전쟁의 승자를 출력하는 프로그램을 작성하시오.

 

 

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 100보다 작거나 같다. 각 테스트 케이스는 다음과 같이 이루어져 있다. 첫째 줄에 N과 M이 들어오고, 둘째 줄에는 세준이의 병사들의 힘이 들어오고, 셋째 줄에는 세비의 병사들의 힘이 들어온다. 힘은 정수이고, 이 값이 클수록 강하고, 작을수록 약하다.

각 테스트 케이스는 줄 바꿈으로 구분되어 있다.

 

 

출력

각 테스트 케이스에 대해서 한 줄에 하나씩 차례대로 승자를 출력한다. 세준이가 이기면 S를 세비가 이기면 B를 둘다 아닐 경우에는 C를 출력한다.

 

 

 

통과한 답안

namespace _1524
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int T = int.Parse(Console.ReadLine());

            for (int i = 0; i < T; i++)
            {
                Console.ReadLine(); // 빈줄 처리용
                
                string[] inputs = Console.ReadLine().Split(' ');
                int N = int.Parse(inputs[0]);
                int M = int.Parse(inputs[1]);
                List<int> sejoon = new List<int>();
                List<int> sebi = new List<int>();

                string[] sejoons = Console.ReadLine().Split(' ');
                for (int j = 0; j < sejoons.Length; j++)
                {
                    sejoon.Add(int.Parse(sejoons[j]));
                }

                string[] sebis = Console.ReadLine().Split(' ');
                for (int j = 0; j < sebis.Length; j++)
                {
                    sebi.Add(int.Parse(sebis[j]));
                }

                int sejoonMax = sejoon.Max();
                int sebiMax = sebi.Max();
                string answer = sejoonMax >= sebiMax ? "S" : "B";
                Console.WriteLine(answer);
            }
        }
    }
}

 

문제에서 설명한 내용은 가장 약한 병사를 하나씩 제거하는 방식으로 설명되어 있지만,

이를 해석하면 가장 강한 병사가 있는 쪽이 이긴다는 뜻으로 해석할 수 있다.

(가장 강한 병사가 같다면 세준이 이긴다)

 

따라서 이를 세준과 세비의 병사들을 List로 만들어 입력하고

이들의 가장 강한 병사의 숫자를 비교하여 강한 쪽을 출력하면 된다.

 

이 때, 위의 코드에서는 List를 사용하였지만, Array를 사용할 수도 있다.

위의 입력 부분을 아래와 같이 수정하여 사용할 수 있는데,

string[] inputs = Console.ReadLine().Split(' ');
int N = int.Parse(inputs[0]);
int M = int.Parse(inputs[1]);
int[] sejoon = new int[N];
int[] sebi = new int[M];

string[] sejoons = Console.ReadLine().Split(' ');
for (int j = 0; j < sejoons.Length; j++)
{
    sejoon[j] = int.Parse(sejoons[j]);
}

string[] sebis = Console.ReadLine().Split(' ');
for (int j = 0; j < sebis.Length; j++)
{
    sebi[j] = int.Parse(sebis[j]);
}

 

 

List와 Array의 차이를 비교하면 아래의 결과를 얻을 수 있다.

 

List를 사용한 것이 아래의 결과이고 Array를 사용한 것이 위의 결과로

List는 새로운 문자를 계속 추가하므로 인덱스를 지정하지 않는 장점이 있지만,

그만큼 메모리를 추가로 할당하는 과정을 거치므로 메모리 소모가 발생하고

Array는 주어진 N과 M으로 메모리를 할당하므로 추가적이 메모리 할당이 발생하지 않는다.

 

따라서 여기서는 List 보다 Array를 사용하는 것이 메모리적인 측면에서 이득이다.

(메모리 제한은 128MB이므로 둘다 문제를 푸는데는 지장이 없다)