[백준] 17281 ⚾ (야구)

문제링크 : https://www.acmicpc.net/problem/17281

 

17281번: ⚾

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

www.acmicpc.net

 

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

public class BJ17281HJ {
    static int n, ans;
    static int[] players = {0, 1, 2, 3, 4, 5, 6, 7, 8};
    static int[] order = new int[9];
    static boolean[] visit = new boolean[9];
    static int[][] arr;
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        arr = new int[n][9];
        for (int i=0; i<n; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j=0; j<9; j++){
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        permPlayer(players, order, visit, 0, 9);
        System.out.println(ans);
    }
    static void permPlayer(int[] players, int[] order, boolean[] visit, int depth, int r){
        // 4번타자가 1번인 경우에만 함수 실행
        if (depth == r && order[3] == 0){
            int gameScore = playGame(order);
            ans = Math.max(ans, gameScore);
            return;
        }
        for (int i=0; i<9; i++){
            if (!visit[i]){
                visit[i] = true;
                order[depth] = players[i];
                permPlayer(players, order, visit, depth+1, r);
                visit[i] = false;
            }
        }
    }
    static int playGame(int[] order){
        // Now : 현재 선수 번호, sum : 게임이 끝난 후 점수의 합
        int now = 0; int sum = 0;
        for (int game = 0; game<n; game++){
            // score : 이닝 당 점수
            int score = 0; int outCount = 0;
            boolean[] base = new boolean[4];

            while (outCount<3){
                switch (arr[game][order[now]]){
                    case 0:
                        outCount++;
                        break;

                    case 1:
                        if (base[3]){
                            score ++;
                            base[3] = false;
                        }
                        if (base[2]){
                            base[3] = true;
                            base[2] = false;
                        }
                        if (base[1]){
                            base[2] = true;
                        }
                        base[1] = true;
                        break;

                    case 2:
                        if (base[3]){
                            score ++;
                            base[3] = false;
                        }
                        if (base[2]){
                            score++;
                        }
                        if (base[1]){
                            base[3] = true;
                            base[1] = false;
                        }
                        base[2] = true;
                        break;

                    case 3:
                        if (base[3]){
                            score ++;
                        }
                        if (base[2]){
                            score ++;
                            base[2] = false;
                        }
                        if (base[1]){
                            score ++;
                            base[1] = false;
                        }
                        base[3] = true;
                        break;

                    case 4:
                        if (base[3]){
                            score ++;
                            base[3] = false;
                        }
                        if (base[2]){
                            score ++;
                            base[2] = false;
                        }
                        if (base[1]){
                            score++;
                            base[1] = false;
                        }
                        score ++;
                        break;
                }
                now ++;
                if (now>=9){
                    now = 0;
                }
            }
            sum += score;
        }
        return sum;
    }
}

풀이 :

1. 순열을 이용하여 선수 순서 정하기

2. 순서가 정해진 후, 4번 타자가 1번선수일때만 (idx=0) playGame 함수를 실행

3. base = new boolean[4]; 를 통해 베이스마다 선수가 있는지 없는지 t/f 로 판별

4. switch~case 문으로 상황에 따라 조건 처리

'Algorithm > Java' 카테고리의 다른 글

[백준] 8979 올림픽  (0) 2024.04.11
[백준] 14719 빗물  (1) 2024.04.10
[백준] 1864 스카이라인 쉬운거  (0) 2024.04.08
[백준] 2146 다리 만들기  (0) 2024.03.25
[백준] 14658 하늘에서 별똥별이 빗발친다  (0) 2024.03.14