본문 바로가기
Algorithm

[백준 17281] ⚾

by YEON-DU 2020. 1. 27.
반응형

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

 

17281번: ⚾

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

www.acmicpc.net

#include <iostream>

using namespace std;

/*
	야구 (9명)
	N이닝 - 공격과 수비
	3아웃이 발생하면 종료
	두 팀이 공수 변경
	경기 시작 전 타순 결정 완료
	3아웃이 발생하지 않는다면 9번 > 1번
	이닝과 독립적으로 타순 진행
	공격 투수가 던진 공을 타자가 치는 것. 1,2,3루 거쳐 홈에 도착하면 1점 득점
	타자가 공을 쳐서 안타, 2루타, 3루타, 홈런, 아웃
	안타 = 타자와 모든 주자가 한 루
	2루타 = 타자와 모든 주자가 두 루
	3루타 = 타자와 모든 주자가 세 루
	홈런 = 타자와 모든 주자가 홈
	아웃 = 모든 주자는 진루하지 못하고 아웃 증가
*/
int N;
int order[10];
int result[51][10];
int answer;
bool isUsed[10];

void baseball()
{
	int hitter = 1;
	int score = 0;
	int base[10] = { 0 };

	for (int i = 1; i <= N; i++) // i이닝
	{
		int out = 0;

		while (true) {
			if (result[i][order[hitter]] == 0) { // i이닝의 hitter번째 타자가 아웃인 경우
				hitter++;
				if(hitter > 9) hitter = 1; // 9번째 타자 이후 1번째 타자로 수정
				out++;

				if (out == 3) {
					// 이닝 교체
					for (int j = 1; j <= 9; j++) base[j] = 0;
					break;
				}
			}
			else {
				// 안타, 2루타, 홈런
				for (int j = 1; j <= 9; j++) {
					if (base[j] > 0 || j == order[hitter]) { //만약 hitter번째 타자가 진루해 있었다면
						base[j] += result[i][order[hitter]]; // i이닝의 hitter번째 타자가 친 공만큼 진루
						if (base[j] >= 4) {
							// 현재 타자가 홈에 도달하면
							base[j] = 0;
							score++;
						}
					}
				}
				hitter++;
				if (hitter > 9) hitter = 1; // 9번째 타자 이후 1번째 타자로 수정
			}
		}
	}

	answer = (answer < score) ? score : answer;
}

void setHitter(int n)
{
	if (n > 9) // 9번 타자까지 모두 사용하면
	{
		baseball();
		return;
	}

	for (int i = 2; i <= 9; i++) // 1번 선수는 이미 사용했으므로
	{
		if (!isUsed[i]) {
			order[n] = i; // n번 선수를 i번 타자로 결정
			isUsed[i] = true;
			if (n == 3) setHitter(5); // 4번 타자는 이미 정했으므로 5번 타자 결정
			else setHitter(n + 1);
			isUsed[i] = false;
		}
	}
}

int main()
{
	scanf("%d", &N);
	isUsed[1] = true;
	order[4] = 1; // 1번 선수를 4번 타자로 결정

	for (int i = 1; i <= N; i++)
	{
		for (int j = 1; j <= 9; j++)
			scanf("%d", &result[i][j]);
	}

	setHitter(1);

	printf("%d", answer);

	return 0;
}

 

시간초과 문제로 scanf와 printf를 사용했다. 가속 함수를 사용해봤지만 마찬가지여서 아예 표준 입출력함수로 변경함.

반응형

'Algorithm' 카테고리의 다른 글

[백준 17472] 다리만들기 2  (0) 2020.02.10
[백준 17142] 연구소 3  (0) 2020.02.10
[백준 1780] 종이의 개수  (0) 2020.01.26
[백준 1756] 피자 굽기  (0) 2020.01.19
[백준 10709] 기상캐스터  (0) 2020.01.19

댓글