본문 바로가기

Computer Science&Engineering/코딩테스트

[ 백준 17281 ] ⚾ 야구 구현 문제

# 문제링크

www.acmicpc.net/problem/17281

 

17281번: ⚾

⚾는 9명으로 이루어진 두 팀이 공격과 수비를 번갈아 하는 게임이다. 하나의 이닝은 공격과 수비로 이루어져 있고, 총 N이닝 동안 게임을 진행해야 한다. 한 이닝에 3아웃이 발생하면 이닝이 종

www.acmicpc.net

DFS로 타자들의 순서를 정하고, 시뮬레이션을 돌려주었습니다. 그냥 뭐 생각할 것도 없고, if 문 여러 개 해서 조건만 맞추어서 돌려주었습니다. 시뮬레이션 문제는 진짜 문제 꼼꼼하게 읽고 그대로! 코드로 구현하는 게 중요한 거 같아요..

 

# 제출 코드 

 

#include <cstdio>
using namespace std;

int N;
int order[10];
int map[51][10];
bool chk[10];
int ans = 0;

/*

안타: 1
2루타: 2
3루타: 3
홈런: 4
아웃: 0

*/

void Input() {
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		for (int j = 1; j <= 9; j++) { // 1번부터 9번
			scanf("%d", &map[i][j]);
		}
	}
}

int Get_num() {
	int num = 0; // 이닝 번호 
	int i = 1; // 현재 순서 
	int cur = order[1]; // 현재 선수 
	int score = 0; // 점수
	int out = 0;
	int ru[4] = { 0, };

	while (num < N) {
		if (map[num][cur] == 0) out++; // 아웃
		else if (map[num][cur] == 1) { // 안타
			if (ru[3] == 1) { score++; ru[3] = 0; }
			if (ru[2] == 1) { ru[3] = 1; ru[2] = 0; }
			if (ru[1] == 1)  ru[2] = 1;
			ru[1] = 1;
		}
		else if (map[num][cur] == 2) { // 2루타 
			if (ru[3] == 1) { score++; ru[3] = 0; }
			if (ru[2] == 1) { score++; ru[2] = 0; }
			if (ru[1] == 1) { ru[3] = 1; ru[1] = 0; }
			ru[2] = 1;
		}
		else if (map[num][cur] == 3) { //3루타 
			if (ru[3] == 1) { score++; ru[3] = 0; }
			if (ru[2] == 1) { score++; ru[2] = 0; }
			if (ru[1] == 1) { score++;; ru[1] = 0; }
			ru[3] = 1;
		}
		else { //홈런
			if (ru[3] == 1) { score++; ru[3] = 0; }
			if (ru[2] == 1) { score++; ru[2] = 0; }
			if (ru[1] == 1) { score++;; ru[1] = 0; }
			score++; // 타자도 득점~!
		}
		if (out == 3) { // 이닝 변경
			num++; out = 0; 
			ru[1] = ru[2] = ru[3] = 0;
		}
		
		i = (i == 9) ? 1 : i+1; // 다음 타자 등판~!
		cur = order[i];
	}
	return score;
}

void DFS(int node) {
	if (node == 10) {
		int ret = Get_num();
		if (ret > ans) ans = ret;
		return;
	}
	for (int i = 2; i < 10; i++) {
		if (chk[i] == true)continue;
		chk[i] = true;
		order[node] = i;

		if (node == 3) DFS(node + 2);
		else DFS(node + 1);

		chk[i] = false;
		order[node] = 0;
	}
}

int main() {
	//freopen("sample_input.txt", "r", stdin);
	Input();
	order[4] = 1; // 4번 타자는 1로 정해짐
	DFS(1);
	printf("%d\n", ans);
}

 

 

채점 시간이 너무 오래걸려서 긴장되었던..ㅎㅎ

반응형