1. 문제

www.acmicpc.net/problem/17281

 

17281번: ⚾

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

www.acmicpc.net

2. 접근방법

 

 

 

순열과 시뮬레이션이 컴비네이션 된 재밌는 문제!

 

첫번째 선수는 무조건 4번 타자이고

나머지 선수들을 각 타순에 배치시켜 경기를 진행하여 가장 큰 점수가 나오는 상황의 점수를 구하는 문제

 

첫 번째 선수를 제외한 8명의 선수를 순열을 이용해

줄 세우기를 하고 주어진 야구 규칙에 맞춰 시뮬레이션 시켜보면 된다.

 

시뮬레이션 시킬때 주의할점은 첫번째선수는 4번타자에 배치시켜 줘야 한다는 것과

이닝이 종료되면 맵에 남아있던 선수들을 비워줘야 한다는것만 조심하자.

 

3. 자바 코드

package Gold;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class P17281야구 {

	static int N, round[][], max;
	static int player[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
	static int sel[] = new int[8];
	static boolean visit[] = new boolean[9];

	public static void main(String[] args) throws Exception {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		round = new int[N][9];
		for (int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for (int j = 0; j < 9; j++) {
				round[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		powerset(0);
		System.out.println(max);
	}

	static void powerset(int selidx) {
		if (selidx == 8) {
			max = Math.max(play(), max);
		}
		
		for (int i = 1; i <= 8; i++) {
			if (visit[i])
				continue;
			sel[selidx] = i;
			visit[i] = true;
			powerset(selidx + 1);
			visit[i] = false;
		}
	}

	static int play() {
		int nownum = 0; // 현재 칠 타자의 타순
		int score = 0;
		int out = 0;
		int map[] = new int[3];
		int hit = 0; // 뭘로 치는지
		gg: for (int i = 0; i < N; i++) { // i는 라운드
			while (true) { //반복 한번당 타자 한명
				if (nownum < 3) {
					hit = round[i][sel[nownum]];
				}
				if (nownum == 3) {
					hit = round[i][0];
				}
				if (nownum > 3) {
					hit = round[i][sel[nownum - 1]];
				}
				nownum = (nownum+1)%9;
				if (hit == 0) {
					out++;
					if (out == 3) {
						out = 0;
						Arrays.fill(map, 0);
						break;
					}
					continue;
				}
				for (int j = 2; j >= 0; j--) {// 기존 맵에 있던 친구들 위치 바꾸기
					int pos = j;
					if (map[pos] == 1) {
						map[pos] = 0;
						pos = pos + hit;
						if (pos > 2) {
							score++;
							continue;
						}
						map[pos] = 1;
					}
				}
				if(hit == 4) {
					score ++;
					continue;
				}
				map[hit-1] = 1;

			}
		}

		return score;
	}
}

4. 마치며

삼성 a형 기출문제들은 시뮬레이션이 많아서 푸는 재미가 있다.

 

 

+ Recent posts