[백준] 17281 야구

문제보기

야구 룰을 잘 몰라서 ㅠㅠ 이해하느라 한참 걸렸지만… 그냥 꼼꼼하게 구현해주시면 됩니다.
1번 선수는 무조건 4번타자라서 나머지 8명 선수에 대해 8!해주면 고작 4만정도라서 그냥 전부 순열로 구해주시면서 최대 득점을 얻어내면 됩니다.
자세한 내용은 주석으로!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;


class Main{
	
	static int ip(String s) { return Integer.parseInt(s); };
	
	// 다음 순열을 만들어주는 함수 
	public static boolean next_perm(int[] arr){
        int i = arr.length -1; 
        while( i > 0 && arr[i-1] >= arr[i]){
            i--;
        }
        if(i <= 0){
            return false; 
        }
        int j = arr.length -1; 
        while( arr[j] <= arr[i-1] ){
            j--;
        }
        
        int temp = arr[j];
        arr[j] = arr[i-1];
        arr[i-1] = temp;
        
        int k = arr.length -1;
        while( i < k ){
            temp = arr[k];
            arr[k] = arr[i];
            arr[i] = temp;
            i++;
            k--;
        }
        return true; 
    }
	
     public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	int n = ip(br.readLine());
    	int[][] results = new int[9][n]; // 주어진 결과값을 저장
    	for(int inn = 0 ; inn < n ; inn++) {
    		StringTokenizer st = new StringTokenizer(br.readLine());
    		for(int player = 0 ; player < 9 ; player++ ) {
    			results[player][inn] = ip(st.nextToken());
    		}
    	}
    	
	// 선수별 타순이 들어갈 배열
	// 초기값으로는 그냥 등번호 = 타순으로 줬습니다 
    	int[] order = {0,1,2,3,4,5,6,7,8};

    	// 최대 득점
    	int max = 0;
    	
    	do {
		// 1번선수가 4번타자가 아닌 순서는 건너뜁니다 
		// 0-index라서 이렇게 적어줬습니다
    		if(order[3] != 0 ) continue;
    		
		// 이번 타순으로 얻게되는 득점 
    		int points = 0;
		// 다음번 타자순서(order의 인덱스값)
    		int next = 0;

		// 이닝별 점수계산     		
    		for(int inn = 0 ; inn < n ; inn++ ) {
				
			// 각 루에 있는 선수의 인원수를 저장(1-index)
    			int[] base = new int[4];
    			int outs = 0; // 현재까지 아웃 수 저장 

    			while(true) {
				// 현재 순서의 타자가 만들게 되는 결과 
    				int play = results[order[next]][inn];

    				if(play == 0) { // 아웃
    					outs++; 
    				}else if(play == 1) { // 안타
    					points += base[3];
    					base[3] = base[2];
    					base[2] = base[1];
    					base[1] = 1;
    				}else if(play == 2) { // 2루타
    					points += base[3] + base[2];
    					base[3] = base[1];
    					base[2] = 1;
    					base[1] = 0;
    				}else if(play == 3) { // 3루타
    					points += base[3] + base[2] + base[1];
    					base[3] = 1;
    					base[2] = base[1] = 0;
    				}else if(play == 4) { // 홈런
    					points += base[3] + base[2] + base[1] + 1;
    					base = new int[4];
    				}
    				next = (next+1)%9; // 다음 타자 순서로 넘깁니다 
    				if(outs == 3) break; // 아웃이 3개라면 이닝이 변경되어야 합니다
    			}
    		}
		// 현 타순으로 만든 득점이 최대득점보다 크다면 갱신 
    		if(points > max) max = points;	
    		
    	}while(next_perm(order)); // 다음 순열로
    	

    	System.out.println(max);
    	
     }
}

Tags:

Categories:

Updated:

Comments