카테고리 없음

[백준] 17281 ⚾(야구) - Java

너지살 2023. 10. 5. 15:38

 

 

 

문제 출저

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

 

17281번: ⚾

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

www.acmicpc.net

 

 

 

문제 풀이

이닝 수 N 과 각 선수들이 각 이닝마다 어떻게 치는지 정보가 주어진다.

이를 통해 선수들의 순서를 정하여 최고 점수를 구하는게 이 문제의 요구사항이다.

 

 

구현 문제로 DFS로 순서를 정하고 Simulation으로 순서에 대한 점수를 구했습니다.

점수를 구할 때 마다 기존에 값과 비교하여 큰 값만 저장하여 최고 점수를 구했습니다.

 

 

 

소스 코드

package baekjoon.backjoon10.day0110.day05;



/*
야구
https://www.acmicpc.net/problem/17281

9명의 타순 순서
8명의 타순만 정하면 된다.
타순을 정한 다음 Simulation을 실행한다.

1번 선수는 4번 타자로 고정
 */

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

public class B17281 {

    static int n;
    static int[][] board;
    static int[] select;
    static boolean[] visited;
    static int result;
    static boolean[] field;


    static int answer;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        board = new int[n][9];
        for(int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for(int j = 0; j < 9; j++) {
                board[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        select = new int[9];
        visited = new boolean[9];
        dfs(0);

        System.out.println(answer);

    }

    public static void dfs(int stage) {
        if(stage == 9) {
            simulation();
            return;
        }

        if(stage == 3) {
            select[stage] = 0;
            dfs(stage+1);
        }

        for(int i = 1; i < 9; i++) {
            if(visited[i] == false) {
                visited[i] = true;
                select[stage] = i;
                dfs(stage+1);
                visited[i] = false;
            }
        }
    }

    public static void simulation() {

        result = 0;
        int now = 0; // 타자 순번


        // 이닝
        for(int i = 0; i < n; i++) {
            int out = 0;
            field = new boolean[4];

            while(out < 3) {
                int player = select[now];
                // 아웃
                int data = board[i][player];
                if(data == 0) {
                    out++;
                }
                else {
                    anta(data);
                }

                now++;
                if(now == 9) {
                    now = 0;
                }
            }
        }

        answer = Math.max(answer, result);

    }

    public static void anta(int number) {
        field[0] = true;
        for(int i = 3; i >= 0; i--) {
            if(field[i] == true) {
                field[i] = false;
                int num = i + number;
                if(num > 3) {
                    result++;
                }
                else {
                    field[num] = true;
                }
            }
        }
    }

}