작성일 :

문제 링크

12756번 - 고급 여관

설명

두 카드가 서로 동시에 공격하여 생명력을 소모시킬 때, 어떤 카드가 살아남는지를 판별하는 문제입니다.

각 플레이어는 공격력과 생명력이 주어진 하나의 카드를 가지고 있으며,

두 카드는 동시에 서로의 생명력을 자신의 공격력만큼 깎습니다.

  • 이때 생명력이 0이하가 되면 해당 카드는 사망 처리됩니다.
  • 둘 중 하나만 살아남으면 그 플레이어가 승리합니다.
  • 만약 두 카드가 동시에 사망한다면 무승부(DRAW)로 처리됩니다.


접근법

게임은 동시에 진행되며, 서로 번갈아 공격하는 방식이 아니라 동시에 피해를 주는 구조입니다.

따라서 두 카드가 동시에 서로에게 피해를 주는 라운드를 반복하면서, 매 턴마다 다음을 수행합니다:

  • 플레이어 A는 자신의 공격력만큼 B의 생명력을 감소시킵니다.
  • 플레이어 B도 동시에 자신의 공격력만큼 A의 생명력을 감소시킵니다.
  • 이후 둘 중 하나라도 생명력이 0이하가 되면 즉시 전투를 종료하고 결과를 판단합니다.

조건 분기를 통해 A만 생존 → A 승, B만 생존 → B 승, 동시 사망 → 무승부를 출력하면 됩니다.



Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;

class Program {
  static void Main() {
    var a = Console.ReadLine().Split();
    var b = Console.ReadLine().Split();

    int atkA = int.Parse(a[0]), hpA = int.Parse(a[1]);
    int atkB = int.Parse(b[0]), hpB = int.Parse(b[1]);

    while (true) {
      hpA -= atkB;
      hpB -= atkA;

      if (hpA <= 0 || hpB <= 0) {
        if (hpA <= 0 && hpB <= 0) Console.WriteLine("DRAW");
        else if (hpA > 0) Console.WriteLine("PLAYER A");
        else Console.WriteLine("PLAYER B");

        break;
      }
    }
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <bits/stdc++.h>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int a1, v1, a2, v2; cin >> a1 >> v1 >> a2 >> v2;
  while (true) {
    v2 -= a1;
    v1 -= a2;
    if (v1 <= 0 || v2 <= 0) {
      cout << (v1 <= 0 && v2 > 0 ? "PLAYER B" :
        v2 <= 0 && v1 > 0 ? "PLAYER A" : "DRAW")
        << "\n";
      break;
    }
  }

  return 0;
}