Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

최's 먹공로그

BOJ17281_야구 본문

APS

BOJ17281_야구

ChoiSH313 2019. 6. 9. 16:48

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