[BOJ] 17281번: ⚾(야구)
문제
입력
첫째 줄에 이닝 수 N(2 ≤ N ≤ 50)이 주어진다. 둘째 줄부터 N개의 줄에는 각 선수가 각 이닝에서 얻는 결과가 1번 이닝부터 N번 이닝까지 순서대로 주어진다. 이닝에서 얻는 결과는 9개의 정수가 공백으로 구분되어져 있다. 각 결과가 의미하는 정수는 다음과 같다.
- 안타: 1
- 2루타: 2
- 3루타: 3
- 홈런: 4
- 아웃: 0
각 이닝에는 아웃을 기록하는 타자가 적어도 한 명 존재한다.
출력
아인타팀이 얻을 수 있는 최대 점수를 출력한다.
풀이
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);
}
}
Author And Source
이 문제에 관하여([BOJ] 17281번: ⚾(야구)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dot2__/BOJ-17281번-야구저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)