최's 먹공로그
BOJ17281_야구 본문
https://www.acmicpc.net/problem/17281
문제요약
1. N 이닝이 주어진다.
2. 각 이닝 별로 타자의 상태가 주어진다.
3. 1 : 안타 , 2 : 2루타 , 3 : 3루타 , 4 : 4루타 , 0 : 아웃
4. 아웃이 3개 쌓이면 이닝이 종료된다.
5. 타자의 순서를 바꾸면서 가장 높은 점수를 얻은 경우의 점수를 출력
문제issue
1. 4번째 타자는 1번 선수로 고정
2. 타순 : 1 -> 2 , 2 -> 3 .... 9 -> 1
3. 이닝 종료시에도 다음 이닝이 있으면 타순은 유지
해결흐름
1. 각 이닝의 타자 상태를 2차원 배열에 입력 받는다.
2. 4번째 타자는 1번 선수로 고정해준다.
3. 4번째 타자는 1번 선수로 고정시켜주는 순열을 수행한다.
4. 조건에 맞는 순열마다 경기를 진행하고 최고득점을 찾는다.
경기진행 부분
1. 각 이닝별 타자의 정보를 가지고 온다.
2. 타자의 정보가 0 , 1 , 2 , 3 , 4 일때로 나눠서 생각한다.
3. 0 일때는 아웃 카운트만 체크하고 3 이상일때 break 해준다.
4. 1 일때는 3루에 주자가 있을 때만 점수에 해당하며 다른 base에 있는 선수는 1루 씩 당겨준다.
5. 2 일때는 2 , 3루에 주자가 있을 때만 점수에 해당하며 다른 base에 있는 선수는 2루 씩 당겨준다.
6. 3 일때는 타자를 제외한 모든 base에 주자가 있으면 점수에 해당한다.
7. 4 일때는 타자까지 포함한 모든 base에 주자가 있으면 점수에 해당한다.
소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Main { private static int N; private static int score; private static int max_score; private static int[] temp_arr; private static boolean[] visited; private static boolean[] base; private static int[][] batting; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); N = Integer.parseInt(br.readLine().trim()); // 이닝 batting = new int[N][10]; for (int i = 0; i < N; i++) { StringTokenizer st = new StringTokenizer(br.readLine().trim(), " "); for (int j = 1; j < 10; j++) { batting[i][j] = Integer.parseInt(st.nextToken()); } } visited = new boolean[10]; temp_arr = new int[10]; // 4번째 타자는 1번 선수로 고정 temp_arr[4] = 1; max_score = Integer.MIN_VALUE; nPm(1); System.out.println(max_score); } // end of main private static void nPm(int len) { if (len == 4) { nPm(len + 1); return; } if (len == 10) { solve(); max_score = max_score < score ? score : max_score; return; } for (int i = 2; i < 10; i++) { if (!visited[i]) { visited[i] = true; temp_arr[len] = i; nPm(len + 1); visited[i] = false; } } } private static void solve() { int batting_order = 1; // 타순 score = 0; for (int i = 0; i < N; i++) { // 이닝이 바뀌면 아웃 카운트와 base 상태를 초기화 된다. int out_cnt = 0; base = new boolean[4]; while (true) { // 타자의 정보 한개를 가지고 온다 int infor = batting[i][temp_arr[batting_order]]; // 타순을 바꿔준다 if (batting_order == 9) { batting_order = 1; } else batting_order++; // 타자의 정보마다 다른 실행을 한다. if (infor == 0) { out_cnt++; if (out_cnt >= 3) { break; } } else if (infor == 1) { if(base[3]) { score++; base[3] = false; } for (int j = 2; j >= 0; j--) { if(base[j]) { base[j] = false; base[j+1] = true; } } base[1] = true; } else if (infor == 2) { if(base[3]) { score++; base[3] = false; } if(base[2]) { score++; base[2] = false; } if(base[1]) { base[1] = false; base[3] = true; } base[2] = true; } else if (infor == 3) { for (int j = 1; j <= 3; j++) { if(base[j]) { score++; base[j] = false; } } base[3] = true; } else if (infor == 4) { for (int j = 1; j <= 3; j++) { if(base[j]) { score++; base[j] = false; } } score++; } } } } } // end of class | cs |
'APS' 카테고리의 다른 글
BOJ17144_미세먼지 안녕! (0) | 2019.06.10 |
---|---|
BOJ2146_다리만들기 (0) | 2019.06.09 |
BOJ14891_톱니바퀴 (2) | 2019.06.04 |
BOJ14499_주사위굴리기 (0) | 2019.06.03 |
BOJ2980_도로와신호등 (0) | 2019.05.29 |