Problem Solving/백준

[삼성 A형 기출 문제] 17281 - ⚾

돌돌김 2020. 2. 17. 23:16

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

 

17281번: ⚾

⚾는 9명으로 이루어진 두 팀이 공격과 수비를 번갈아 하는 게임이다. 하나의 이닝은 공격과 수비로 이루어져 있고, 총 N이닝동안 게임을 진행해야 한다. 한 이닝에 3아웃이 발생하면 이닝이 종료되고, 두 팀이 공격과 수비를 서로 바꾼다. 두 팀은 경기가 시작하기 전까지 타순(타자가 타석에 서는 순서)을 정해야 하고, 경기 중에는 타순을 변경할 수 없다. 9번 타자까지 공을 쳤는데 3아웃이 발생하지 않은 상태면 이닝은 끝나지 않고, 1번 타자가 다시 타석에

www.acmicpc.net

어려운 자료구조나 복잡한 알고리즘이 있진 않았지만, 구현할게 많아서 귀찮았다.

 

타순에 따라, 득점하는 결과가 다르므로 최대 득점하는 타순을 찾으려면 모든 경우를 따져봐야 한다. 타순을 정하기 위해 next_permutation을 사용하였다. 각 타순에 따라 선수들이 행동을 하고, 그에 맞게 득점 결과를 반환한 뒤, 가장 큰 득점 결과를 출력하면 된다.

 

문제를 해결하며 생각을 해야할 부분은

  1. 1번선수는 무조건 4번 타석에 서야하는 것
  2. 이닝이 바뀌어도, 타석의 순서는 유지되야 하는것( 1이닝에서 5번 선수에서 3 Out을 당하면 2이닝에서는 6번 선수부터 타석에 들어감)

정도 였다.

 

먼저, 1번 요구사항을 만족시키기 위해, deque 자료형을 사용하였다. 1을 제외하고 2,3,4,5,6,7,8,9를 넣은 뒤, 4번째 위치에 1을 삽입한 뒤, next_permutation을 돌렸다.

 

 

다음은, 각 주자의 행동별로 득점을 하는지 확인하였다.

ground 배열에 1,2,3루의 정보를 저장하고 cur_player에 현재 타석에 들어간 타자의 번호를 저장하고 그에 맞는 행동을 하기 위해 play[i][cur_player-1]에서 값을 가져왔다.

 

한명의 행동의 끝나면 값을 하나 증가시켜서 다음 선수가 행동할 수 있게 하였고, 9가 넘어가면 안되므로 9의 나머지값을 사용하였다.