본문 바로가기
알고리즘/백준

[백준 17281] ⚾ (C++)

by Bloofer 2020. 8. 6.

A. 문제설명

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

문제에 대한 자세한 설명은 링크 참조

 

1. 9명으로 이루어진 야구팀의 선수들이 N이닝동안 플레이

2. 1번부터 9번의 타자들은 매 이닝마다 3아웃이 발생할 때까지 순환하며 타석에 들어감(1→2→3→...→8→9→1→2→...)

3. 각 타자가 타석에서 내는 결과는 아웃/안타/2루타/3루타/홈런로 아래와 같음

  • 안타: 타자와 모든 주자가 한 루씩 진루
  • 2루타: 타자와 모든 주자가 두 루씩 진루
  • 3루타: 타자와 모든 주자가 세 루씩 진루
  • 홈런: 타자와 모든 주자가 홈까지 진루
  • 아웃: 모든 주자는 진루하지 못하고, 공격 팀에 아웃이 하나 증가

4. 매 이닝마다 타자가 수행할 결과는 정해짐

5. 감독은 1번 선수를 4번 타자로 선점함, 나머지 8명을 배치하는 조합 중, 최대 점수가 나는 경우를 구하라

 

B. 접근법

DFS + 시뮬레이션

 

우선, 1번 선수가 4번 타자로 선점된 경우를 조건으로 모든 선수를 각 순서대로 배치하는 조합을 구한다.

그리고, 매 조합을 이용하여 야구게임 시뮬레이션을 수행, 매 시뮬레이션에서 수행된 결과를 계산하여 최대에 업데이트

 

C. 풀이

1. 1번 선수가 4번 타자로 선점된 경우를 조건으로 모든 선수를 각 순서대로 배치하는 조합을 구함 - dfs()

2. 해당 조합에 대해서 야구게임 시뮬레이션 수행 - simulate_play()

3. 해당 타자 조합으로 들어온 이닝 정보 배열을 복사

4. N 이닝동안 플레이를 반복

5. while 문 안에서, 아웃이 3개 누적되기 전까지 1/2/3루에 선수를 진출시킴

6. 안타-1루씩, 2루타-2루씩, 3루타-3루씩, 홈런-모두 홈까지 진루

7. 모든 이닝 플레이가 완료시 해당 점수를 최대값에 업데이트

 

D. 내 코드