[백준 12756] 고급 여관 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
두 카드가 서로 동시에 공격하여 생명력을 소모시킬 때, 어떤 카드가 살아남는지를 판별하는 문제입니다.
각 플레이어는 공격력과 생명력이 주어진 하나의 카드를 가지고 있으며,
두 카드는 동시에 서로의 생명력을 자신의 공격력만큼 깎습니다.
- 이때 생명력이
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;
}