문제 링크입니다: https://www.acmicpc.net/problem/17281
17281번: ⚾
⚾는 9명으로 이루어진 두 팀이 공격과 수비를 번갈아 하는 게임이다. 하나의 이닝은 공격과 수비로 이루어져 있고, 총 N이닝 동안 게임을 진행해야 한다. 한 이닝에 3아웃이 발생하면 이닝이 종�
www.acmicpc.net
가장 많은 득점을 하는 타순을 찾기 위해 1번 선수부터 9번 선수까지의 모든 순열에 대해 시뮬레이션을 돌려야하는 문제였습니다.
문제 조건으로 1번 선수가 4번 타자가 되어야 하기 때문에 순열의 네 번째 인덱스가 0인지 확인한 뒤 시뮬레이션을 돌렸습니다. (v[0] == 3)
타순은 이닝이 변경되어도 순서를 유지해야하기 때문에 덱을 사용하여 현재 타석에 선 타자를 push_back 메서드를 통해 맨 뒤로 보냈습니다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
#include <algorithm> | |
#include <deque> | |
using namespace std; | |
const int BASE_MAX = 3; | |
const int PLAYER_MAX = 9; | |
const int MAX = 50; | |
int N; | |
int temp, result; | |
int innings[MAX][PLAYER_MAX]; | |
vector<int> v; | |
deque<int> dq; | |
void func(int inning) | |
{ | |
int out = 0; | |
int bases[BASE_MAX] = { 0, }; | |
for (; out != 3;) | |
{ | |
int cur = dq.front(); | |
dq.pop_front(); | |
dq.push_back(cur); | |
int player = innings[inning][cur]; | |
switch (player) | |
{ | |
case 0: | |
out++; | |
break; | |
case 1: | |
if (bases[2]) | |
{ | |
temp++; | |
bases[2] = 0; | |
} | |
for (int i = 1; i >= 0; i--) | |
{ | |
bases[i + 1] = bases[i]; | |
bases[i] = 0; | |
} | |
bases[0] = 1; | |
break; | |
case 2: | |
for (int i = 2; i >= 1; i--) | |
{ | |
if (bases[i]) | |
{ | |
temp++; | |
} | |
bases[i] = 0; | |
} | |
if (bases[0]) | |
{ | |
bases[2] = 1; | |
bases[0] = 0; | |
} | |
bases[1] = 1; | |
break; | |
default: | |
for (int i = 2; i >= 0; i--) | |
{ | |
if (bases[i]) | |
{ | |
temp++; | |
} | |
bases[i] = 0; | |
} | |
if (player == 3) | |
{ | |
bases[2] = 1; | |
} | |
else | |
{ | |
temp++; | |
} | |
break; | |
} | |
} | |
} | |
int main(void) | |
{ | |
ios_base::sync_with_stdio(0); | |
cin.tie(0); | |
cin >> N; | |
for (int i = 0; i < N; i++) | |
{ | |
for (int j = 0; j < PLAYER_MAX; j++) | |
{ | |
cin >> innings[i][j]; | |
} | |
} | |
v.resize(PLAYER_MAX); | |
for (int i = 0; i < PLAYER_MAX; i++) | |
{ | |
v[i] = i; | |
} | |
do | |
{ | |
dq.clear(); | |
if (v[3] == 0) | |
{ | |
for (int i = 0; i < PLAYER_MAX; i++) | |
{ | |
dq.push_back(v[i]); | |
} | |
temp = 0; | |
for (int i = 0; i < N; i++) | |
{ | |
func(i); | |
} | |
result = max(result, temp); | |
} | |
} while (next_permutation(v.begin(), v.end())); | |
cout << result << "\n"; | |
return 0; | |
} |


개발환경:Visual Studio 2019
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
반응형
'알고리즘 > BOJ' 카테고리의 다른 글
백준 19235번 모노미노도미노 (0) | 2020.06.12 |
---|---|
백준 2517번 달리기 (0) | 2020.06.08 |
백준 16964번 DFS 스페셜 저지 (0) | 2020.06.04 |
백준 1941번 소문난 칠공주 (0) | 2020.06.04 |
백준 2665번 미로만들기 (0) | 2020.06.03 |