DMOPC '19 Contest 5 P2 - Charlie's Crazy Conquest

2023. 10. 7. 00:24·문제정리

DMOPC 2019 2월 대회 문제 Charlie's Crazy Conquest입니다.

본 포스트는 이해를 돕기 위해 문제를 간략하게만 정리하였으므로 상세 내용과 코드 제출은 아래 링크를 참고해 주세요.

 

DMOPC '19 Contest 5 P2 - Charlie's Crazy Conquest - DMOJ: Modern Online Judge

Charlie just downloaded the new free-to-play game Raid: Shadow Legends Conquest. Just what he wanted! In this game, he must defeat enemies, all of which are bots, and restore power to his clan. Both Charlie and the enemy before him start with H health poin

dmoj.ca

 

문제 개요 설명


플레이어와 적이 번갈아가며 각자의 턴에 공격(A)과 회피(D)를 선택하여 서로를 쓰러트리는 게임이 있습니다.

턴은 플레이어부터 시작하며, 자세한 게임의 룰은 다음과 같습니다.

 

만약 공격을 하는 경우, 상대방이 이전 행동으로 회피를 선택했다면 공격이 실패하고 상대가 회피한 만큼의 반동 데미지를 본인이 받습니다.

상대방이 이전 행동으로 회피를 선택하지 않은 경우에만 공격이 성공하여 상대에게 데미지를 줄 수 있습니다.

 

마찬가지로 회피 행동을 선택하는 경우, 상대방이 다음 행동으로 공격을 한다면 해당 공격을 회피합니다.

다만 상대방이 다음 행동으로 공격하지 않으면 예측에 실패했기 때문에 회피하려고 했던 만큼의 데미지를 본인 스스로 받습니다.

 

데미지 계산을 위해 어떤 행동을 할지 선택하는 동시에, 데미지 수치도 함께 정하여 데미지를 얼마나 주고받게 될지를 결정하게 됩니다.

예를 들면 A 90 인 경우에는 적에게 90만큼 데미지를 주는 공격을 의미하고, D 50 인 경우에는 회피 반동 데미지가 50임을 의미합니다.

 

이렇게 게임을 진행하다가 먼저 체력이 0이 되는 쪽이 패배하며, 모든 라운드가 끝난 이후에도 플레이어와 적 둘다 체력이 0 이상으로 남아 있다면 비기게 됩니다.

 

입력


  • 첫 줄은 플레이어와 적의 체력을 의미하는 정수 H, 그리고 게임의 라운드 수를 의미하는 정수 N이 입력됩니다.
  • 그다음 N개의 줄은 플레이어의 행동과 데미지를 의미합니다.
  • 그리고 그 다음 N개의 줄은 적의 행동과 데미지를 의미합니다.

출력


  • 게임의 결과를 출력합니다.
  • 플레이어가 승리한 경우 VICTORY, 적이 승리한 경우 DEFEAT, 둘 다 생존하여 동점인 경우 TIE를 출력합니다.

 

입출력 예시


입력 :

3 100
A 50
D 10
A 100
A 90
D 0
A 0

출력 :

DEFEAT

게임은 총 3번의 라운드로 진행되며, 플레이어와 적의 체력은 각 100씩입니다.

그다음 3줄은 플레이어의 행동, 그다음 3줄은 적의 행동을 의미합니다.

 

다만 게임의 라운드는 플레이어-적이 번갈아가면서 진행되기 때문에 정확한 게임의 흐름은 다음과 같습니다.

플레이어 A 50 → 적 A 90 → 플레이어 D 10 → 적 D 0 → 플레이어 A 100 → 적 A 0

 

라운드 플레이어 적 플레이어 체력 적 체력
1라운드 50만큼 공격 (성공) 90만큼 공격 (성공) 10 50
2라운드 10만큼 회피 (실패) 0만큼 회피 (실패) 0 50

 

플레이어 체력이 0으로 먼저 감소하여 결과로 DEFEAT가 출력됩니다.

 

솔루션 코드


info = list(map(int,input().split()))
turn = info[0]

# 플레이어와 적의 체력 설정
player_hp = info[1]
enemy_hp = info[1]

# 플레이어의 행동 리스트 설정
player_act = []
player_val = []

for i in range(turn):
    info = input().split()
    player_act.append(info[0])
    player_val.append(int(info[1]))

# 적의 행동 리스트 설정
enemy_act = []
enemy_val = []

for i in range(turn):
    info = input().split()
    enemy_act.append(info[0])
    enemy_val.append(int(info[1]))

# 최종 행동 리스트 생성
act = ['dummy']
val = [-1]
for i in range(turn):
    act.append(player_act[i])
    act.append(enemy_act[i])
    val.append(player_val[i])
    val.append(enemy_val[i])
act.append('dummy')
val.append(-1)

# 게임 로직 구현
index = 1
while (player_hp > 0 and enemy_hp > 0) and index < (turn * 2) + 1:
    # 만약 공격이면
    if act[index] == 'A':
        # 상대가 이전에 회피하지 않았으면 그대로 공격이 들어간다
        if act[index - 1] != 'D':
            if index % 2 == 0:
                player_hp -= val[index]
            else :
                enemy_hp -= val[index]
    # 만약 회피라면
    if act[index] == 'D':
        # 상대의 다음 행동이 공격이 아니라면 내가 스스로 데미지를 입는다
        if act[index + 1] != 'A':
            if index % 2 == 0:
                enemy_hp -= val[index]
            else:
                player_hp -= val[index]
    index += 1

# 결과 출력
if player_hp > 0 and enemy_hp < 1:
    print("VICTORY")
elif enemy_hp > 0 and player_hp < 1:
    print("DEFEAT")
elif player_hp > 0 and enemy_hp > 0:
    print("TIE")

 

먼저 입력되는 정보들을 일단 저장하고, 실제 행동이 진행될 순서대로 리스트에 정리하여 담았습니다.

이 과정에서 저는 out of index 에러를 로직에서 따로 체크하게 하고 싶지 않아서 리스트 앞뒤로 더미 데이터를 넣어주었습니다. 여기에서 처리해주지 않더라도 이후에 if문에서 맨 앞 혹은 맨뒤일 경우를 따로 체크하도록 조건을 걸어주셔도 됩니다.

 

그다음으로 게임 진행 로직에서 고려해야 할 것은 최종 행동 리스트에서 1,3,5,7 즉 홀수 번째 차례는 플레이어의 차례이고 2,4,6,8 즉 짝수 번째 차례는 적의 순서가 된다는 점.

그리고 행동을 체크할 때마다 상대의 공격 or 회피 여부를 확인하여 경우에 따라 알맞게 체력을 감소시켜줘야 한다는 점입니다.

 

 

'문제정리' 카테고리의 다른 글

USACO 2019 January Contest, Bronze Problem 3. Guess the Animal  (1) 2023.10.15
grind75 week1 : Two Sum  (0) 2023.09.18
USACO 2023 February Contest, Bronze Problem 1 Hungry Cow  (0) 2023.08.14
USACO 2023 US Open Contest, Bronze Problem 1 FEB  (0) 2023.08.08
COCI '14 Contest 2 #2 Utrka  (0) 2023.07.25
'문제정리' 카테고리의 다른 글
  • USACO 2019 January Contest, Bronze Problem 3. Guess the Animal
  • grind75 week1 : Two Sum
  • USACO 2023 February Contest, Bronze Problem 1 Hungry Cow
  • USACO 2023 US Open Contest, Bronze Problem 1 FEB
seondays
seondays
  • seondays
    Maybe seondays
    seondays
  • 전체
    오늘
    어제
    • 분류 전체보기 (38)
      • python (5)
      • Java (16)
      • Dart (0)
      • 문제정리 (13)
      • etc (4)
  • 태그

    트러블슈팅
    Python
    buddyguard
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
seondays
DMOPC '19 Contest 5 P2 - Charlie's Crazy Conquest
상단으로

티스토리툴바