πŸ“ μ•Œκ³ λ¦¬μ¦˜/BruteForce

[λ°±μ€€]17281번 ⚾(야ꡬ)

점이 2021. 8. 17. 13:30
λ°˜μ‘ν˜•

문제

μž…λ ₯

첫째 쀄에 이닝 수 N(2 ≤ N ≤ 50)이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” 각 μ„ μˆ˜κ°€ 각 μ΄λ‹μ—μ„œ μ–»λŠ” κ²°κ³Όκ°€ 1번 이닝뢀터 N번 μ΄λ‹κΉŒμ§€ μˆœμ„œλŒ€λ‘œ 주어진닀. μ΄λ‹μ—μ„œ μ–»λŠ” κ²°κ³ΌλŠ” 9개의 μ •μˆ˜κ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄μ Έ μžˆλ‹€. 각 κ²°κ³Όκ°€ μ˜λ―Έν•˜λŠ” μ •μˆ˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  • μ•ˆνƒ€: 1
  • 2루타: 2
  • 3루타: 3
  • ν™ˆλŸ°: 4
  • 아웃: 0

각 μ΄λ‹μ—λŠ” 아웃을 κΈ°λ‘ν•˜λŠ” νƒ€μžκ°€ 적어도 ν•œ λͺ… μ‘΄μž¬ν•œλ‹€.

좜λ ₯

μ•„μΈνƒ€νŒ€μ΄ 얻을 수 μžˆλŠ” μ΅œλŒ€ 점수λ₯Ό 좜λ ₯ν•œλ‹€.


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

 

17281번: ⚾

βšΎλŠ” 9λͺ…μœΌλ‘œ 이루어진 두 νŒ€μ΄ 곡격과 μˆ˜λΉ„λ₯Ό λ²ˆκ°ˆμ•„ ν•˜λŠ” κ²Œμž„μ΄λ‹€. ν•˜λ‚˜μ˜ 이닝은 곡격과 μˆ˜λΉ„λ‘œ 이루어져 있고, 총 N이닝 λ™μ•ˆ κ²Œμž„μ„ 진행해야 ν•œλ‹€. ν•œ 이닝에 3아웃이 λ°œμƒν•˜λ©΄ 이닝이 μ’…

www.acmicpc.net


풀이

4λ²ˆνƒ€μžλ₯Ό μ œμ™Έν•œ νƒ€μˆœμ„ μ •ν•΄μ•Ό ν•˜λ―€λ‘œ 'μˆœμ—΄'

νƒ€μˆœμ •ν•˜λŠ” μˆœμ—΄ μ½”λ“œλ₯Ό μž‘μ„±ν•œ λ’€, 기저쑰건이 λ§Œμ‘±ν•˜λ©΄ κ²Œμž„μ„ 진행

κ²Œμž„μ€ 주어진 μ΄λ‹λ§ŒνΌ 반볡되며, out μΉ΄μš΄νŠΈκ°€ 3이 되면 이닝 λ³€κ²½.

μ•ˆνƒ€λΆ€ν„° ν™ˆλŸ°κΉŒμ§€μ˜ μ•‘μ…˜μ„ 각각 μ„€μ •

μ½”λ“œ

import java.io.*;
import java.util.*;

public class Main{
	static int n;
	static int[][] score;
	static int max_score;
	static boolean[] isSelected;
	static int[] tasun;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		score = new int[n][9];
		
		for(int i =0 ; i < n ; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine()," ");
			for(int j = 0 ; j < 9 ; j ++) {
				score[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		max_score = Integer.MIN_VALUE;
		isSelected = new boolean[9];
		isSelected[0] = true;				//1λ²ˆμ„ μˆ˜λŠ” 이미 배치
		tasun = new int[9];
		tasun[3] = 0;						//4λ²ˆνƒ€μžλŠ” 이미 배치
		perm(0);							//μˆœμ—΄ μ‹€ν–‰
		
		System.out.println(max_score);
	}
	
	public static void perm(int cnt) {
		if(cnt == 3) { // 4번째 νƒ€μžλŠ” 1번.
            perm(cnt + 1);
            return;
        }
		else if(cnt == 9) {		//기저쑰건
			game();				//κ²Œμž„μ§„ν–‰
			return;
		}
		for(int i = 1; i < 9 ; i++) {
			if(isSelected[i]) continue;	
			tasun[cnt] = i; 
			isSelected[i] = true;
			perm(cnt+1);
			isSelected[i] = false;
		}
	}
	
	public static void game() {
		int out = 0;						//out카운트
		int cur = 0;						//ν˜„μž¬ νƒ€μž μˆœμ„œ
		int ining = 0;						//이닝
		int win =0;							//승점
		boolean hit[] = new boolean[3];		//루의 μƒνƒœ(false-주자 μ—†μŒ, true-주자있음)
		while(ining<n) {
			out = 0;					//이닝 μ‹œμž‘μ‹œ outκ³Ό 루 μ΄ˆκΈ°ν™”
			hit = new boolean[3];
			while(out<3) {			//1~4에 λ”°λ₯Έ 루의 λ³€ν™” 및 득점
				if(score[ining][tasun[cur]] == 0) out++;	//아웃
				else if(score[ining][tasun[cur]] == 1) {	//μ•ˆνƒ€
					if(hit[2]) win ++;
					hit[2] = hit[1];
					hit[1] = hit[0];
					hit[0] = true;
				}
				else if(score[ining][tasun[cur]] == 2) {	//2루
					if(hit[2]) win ++;
					if(hit[1]) win++;
					hit[2] = hit[0];
					hit[1] = true;
					hit[0] = false;
				}
				else if(score[ining][tasun[cur]] == 3) {	//3루
					if(hit[2]) win ++;
					if(hit[1]) win++;
					if(hit[0]) win++;
					hit[2] = true;
					hit[1] = false;
					hit[0] = false;
				}
				else if(score[ining][tasun[cur]] == 4) {	//ν™ˆλŸ°
					if(hit[2]) win++;
					if(hit[1]) win++;
					if(hit[0]) win++;
					hit[2] = false;
					hit[1] = false;
					hit[0] = false;
					win++;
				}
				cur = (cur+1)%9;		//9번 μ„ μˆ˜ ν›„, λ‹€μ‹œ 1번으둜 λŒμ•„κ°€λŠ” μˆœν™˜κ΅¬μ‘°μ΄λ―€λ‘œ
			}
			ining ++;
		}
		max_score = Math.max(max_score, win);
	}
}
λ°˜μ‘ν˜•