[BOJ] 17281번: ⚾(야구)

문제

입력

첫째 줄에 이닝 수 N(2 ≤ N ≤ 50)이 주어진다. 둘째 줄부터 N개의 줄에는 각 선수가 각 이닝에서 얻는 결과가 1번 이닝부터 N번 이닝까지 순서대로 주어진다. 이닝에서 얻는 결과는 9개의 정수가 공백으로 구분되어져 있다. 각 결과가 의미하는 정수는 다음과 같다.

  • 안타: 1
  • 2루타: 2
  • 3루타: 3
  • 홈런: 4
  • 아웃: 0
    각 이닝에는 아웃을 기록하는 타자가 적어도 한 명 존재한다.

출력

아인타팀이 얻을 수 있는 최대 점수를 출력한다.


17281번: ⚾


풀이

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);
    }
}

좋은 웹페이지 즐겨찾기