C# 코딩테스트 강좌, 주몽의 명령

안녕하세요! 이번 포스트에서는 C# 언어를 활용한 코딩 테스트 문제를 하나 풀어보겠습니다. 주제는 ‘주몽의 명령’입니다. 이 문제는 주몽이 명령을 내리는 상황을 시뮬레이션 하고, 이를 효율적으로 처리하는 알고리즘을 구현하는 과정입니다. 문제를 해결하는 방법과 코드 구현에 대해 자세히 설명하겠습니다.

문제 설명

주몽은 매번 전투를 하기 전에 전사들에게 명령을 내립니다. 각 전사는 자신이 받은 명령에 따라 임무를 수행합니다. 전사들은 주몽의 명령을 다음과 같이 해석합니다:

  • 전사의 고유 번호 (1부터 시작하는 양의 정수)
  • 명령의 내용 (어떠한 조작을 수행해야 하는지를 나타냄)

주몽은 N명의 전사와 M개의 명령을 가지고 있습니다. 명령은 다음과 같은 형식으로 주어집니다:

    1. ATTACK A B  // A번 전사가 B번 전사를 공격
    2. DEFENSE A   // A번 전사가 방어 자세를 취함
    3. RETREAT A    // A번 전사가 후퇴
    

각 전사가 성공적으로 임무를 수행할 경우 ‘SUCCESS’, 실패할 경우 ‘FAIL’로 결과를 출력해야 합니다. 전사는 매번 명령을 수행하기 전 자신이 흥미를 잃으면 명령을 수행하지 않습니다. 흥미는 시간이 지남에 따라 감소합니다. 만약 전사가 명령을 수행할 수 없는 상황이라면 ‘FAIL’을 출력해야 합니다.

입력 형식

입력은 다음과 같은 형식으로 주어집니다:

    N (전사 수)
    M (명령 수)
    흥미 감소율 (0 ~ 1)
    명령들 (M 개)
    

출력 형식

각 명령에 대해 결과를 출력합니다. 결과는 명령의 순서와 동일하게 나열됩니다.

문제 접근 방법

이 문제는 주어진 명령을 처리하고 각 전사가 명령을 수행할 수 있는지를 판단하는 알고리즘을 요구합니다. 문제 해결을 위해 다음과 같은 단계를 고려하겠습니다:

  1. 전사와 명령 리스트를 저장할 수 있는 자료구조를 만든다.
  2. 각 전사는 처음에 100%의 흥미를 가지고 있다고 가정한다.
  3. 주어진 흥미 감소율에 따라 전사의 흥미를 감소시키고, 각 명령을 처리하며 상태를 업데이트한다.
  4. 명령의 결과를 기반으로 성공 또는 실패를 기록한다.

구현

코드 예시

다음은 위의 접근 방법에 따라 C#으로 구현한 코드입니다:


using System;
using System.Collections.Generic;

namespace JumongCommand
{
    class Warrior
    {
        public int Id { get; set; }
        public double Interest { get; set; }

        public Warrior(int id)
        {
            Id = id;
            Interest = 1.0; // 100% 흥미
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int N = int.Parse(Console.ReadLine());
            int M = int.Parse(Console.ReadLine());
            double interestDecayRate = double.Parse(Console.ReadLine());

            List warriors = new List();
            for (int i = 1; i <= N; i++)
            {
                warriors.Add(new Warrior(i));
            }

            List results = new List();
            for (int i = 0; i < M; i++)
            {
                string command = Console.ReadLine();
                string[] parts = command.Split(' ');

                if (parts[0] == "ATTACK")
                {
                    int attackerId = int.Parse(parts[1]);
                    int targetId = int.Parse(parts[2]);
                    ProcessAttack(warriors, results, attackerId, targetId);
                }
                else if (parts[0] == "DEFENSE")
                {
                    int defenderId = int.Parse(parts[1]);
                    ProcessDefense(warriors, results, defenderId);
                }
                else if (parts[0] == "RETREAT")
                {
                    int retreatId = int.Parse(parts[1]);
                    ProcessRetreat(warriors, results, retreatId);
                }

                // 흥미 감소 적용
                foreach (var warrior in warriors)
                {
                    warrior.Interest -= interestDecayRate;
                    if (warrior.Interest < 0)
                        warrior.Interest = 0;
                }
            }

            foreach (var result in results)
            {
                Console.WriteLine(result);
            }
        }

        static void ProcessAttack(List warriors, List results, int attackerId, int targetId)
        {
            var attacker = warriors[attackerId - 1];
            var target = warriors[targetId - 1];

            if (attacker.Interest > 0)
            {
                results.Add("SUCCESS");
            }
            else
            {
                results.Add("FAIL");
            }
        }

        static void ProcessDefense(List warriors, List results, int defenderId)
        {
            var defender = warriors[defenderId - 1];

            if (defender.Interest > 0)
            {
                results.Add("SUCCESS");
            }
            else
            {
                results.Add("FAIL");
            }
        }

        static void ProcessRetreat(List warriors, List results, int retreatId)
        {
            var retreatingWarrior = warriors[retreatId - 1];

            if (retreatingWarrior.Interest > 0)
            {
                results.Add("SUCCESS");
            }
            else
            {
                results.Add("FAIL");
            }
        }
    }
}

코드 설명

코드는 ‘Warrior’ 클래스를 정의하여 각 전사의 상태를 관리합니다. 전사는 고유 ID와 현재 흥미를 속성으로 갖습니다. 메인 프로그램에서는 전사 리스트와 명령 리스트를 차례대로 읽고, 각 명령을 처리하는 별도의 메소드를 호출하여 결과를 업데이트합니다.

결과 확인

명령이 완료된 후, 결과 리스트를 출력하여 최종 성공 또는 실패 결과를 확인합니다. 이와 같은 방식으로 전사들이 명령을 수행하고 리소스를 관리하는 과정을 간단하게 구현한 것입니다.

테스트 케이스

제대로 동작하는지 확인하기 위해 몇 가지 테스트 케이스를 만들 수 있습니다.

예시 입력

5
3
0.1
ATTACK 1 2
DEFENSE 3
RETREAT 4

예상 결과

SUCCESS
SUCCESS
SUCCESS

이와 같은 방식으로 다양한 입력을 테스트하여 알고리즘이 모든 상황에 올바르게 반응하는 지 확인할 수 있습니다.

마무리

이번 포스트에서는 ‘주몽의 명령’ 문제를 해결하기 위한 과정을 살펴보았습니다. 알고리즘의 구조와 구현 방법을 이해하고, 다양한 명령 처리에 대한 로직을 구축하는 것이 중요했습니다. 앞으로도 더 많은 알고리즘 문제를 통해 실력을 쌓아가시길 바랍니다. 감사합니다!