[학습 7회차] 2018 카카오페스티벌 본선 문제풀이_승부예측

2020. 2. 17. 20:01

오늘은 마지막 회차를 맞아서 예선 문제가 아닌 본선 문제를 풀어볼 예정이다. 

본선 문제의 첫 번째 문제만 풀면 시간을 다 소비할 것 같아서 첫 번째 문제를 제대로 풀어보려고 한다.

우선 문제를 풀기에 앞서 매번 하듯이 문제를 정리해 볼 예정이다.

 

[문제 정리]

조별 경기 리그의 각 팀이 이길 확률을 계산하는 문제이다. 

조별 리그의 규칙은 아래와 같다.

1. 4개의 팀이 진행한다.

2. 한 팀은 자신을 제외한 모든 상대방과 한 번씩 3번의 경기를 치른다.

3. 승점은 3점, 비기는 경우 서로 승점 1점, 지는 경우에는 0점을 얻는다.

4. 조별 리그는 모두 치른 후 승점 순으로 순위를 정한다. 점수가 같은 시에는 추첨으로 순위를 정한다.

   순위를 정한 뒤에 상위 2팀은 다음 라운드로 진출한다.

 

우리는 6경기 전체에 대해서 어떤 팀이 이길 확률, 비길확률, 패배할 확률을 예측하였다.

전문가들 예상대로 진행이 된다면 각 팀이 조별 리그를 통과하여 다음 라운드로 진출할 확률이 궁금해졌다.

이것을 계산하는 것이 문제의 관건이다.

 

[입력]

첫 번째로 국가명 4개를 입력한다. 공백으로 구분되어있으며, 주어지는 모든 국가명은 알파벳 대문자 1~10길이를 가진 국가명을 입력할 수 있다.

 

그 다음 2~7번째 줄에는 A B W D L 순으로 입력 5개를 할 수 있다.

이것을 문자말고 그대로 설명하면 팀1이름/팀2이름/팀1이 승리할 확률/비길확률/질확률이다.

A와 B가 같은 경우는 없고, W/D/L은 최대 소수점 세 자리까지 주어지며 이 세 가지를 합치면 1이 보장된다.

 

[출력]

각각의 i번째 팀에 대한 진출 확률을 i번째 출력에 나타낸다.

 

그럼 이 문제를 어떻게 해결해야할지 고민을 해 보자.

완전 탐색을 이용해서 풀어야 하는 문제인 것 같다. 우선 각각 이기면 3점, 지면 0점 비기면 1점이기 때문에 각각의 확률에 점수를 곱해서 총 합을 구한 다음 등수를 매기는 방법으로 해결하면 될 것 같다.

 

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
package kakoFestival;
import java.util.Scanner;
 
public class real_A {
    public static void main (String args[]) {
            Scanner scan = new Scanner(System.in);
            //String team[] = new String[4]; //팀 이름
            ArrayList<String> team = new ArrayList<String>();
            double score[] = new double[4]; //각 팀별 점수
            
            double win[] = new double[6]; //이길 확률
            double none[] = new double[6]; //비길 확률
            double lose[] = new double[6]; //질 확률
            
            for(int i=0; i<4; i++) {
                team.add(scan.next());
            }
            
            for(int j=0; j<6; j++) {
                int teamA = team.indexOf(scan.next()); //첫번째 팀 인덱스
                int teamB = team.indexOf(scan.next()); //두번째 팀 인덱스
                
                win[j] = scan.nextDouble();
                none[j] = scan.nextDouble();
                lose[j] = scan.nextDouble();
                
                if(win[j] == 1.0) {
                    score[teamA] += 3;
                }
                else if(lose[j] == 1.0) {
                    score[teamB] += 3;
                }
                else if(win[j] == lose[j]) {
                    score[teamA] += 1;
                    score[teamB] += 1;
                }
                else {
                    //그 외의 상황이 더 있을 것 같음
                }
            }
            //점수 순서대로 출력
            for(int i=0; i<4; i++) {
                System.out.println(String.format("%.10f", score[i]));
            }        
    }
}
 

 

각각의 경우를 판단해 순위권에 들 수 있도록 등수를 파악하기 위한 점수를 구하는 것까지 완료했다.

BELATED ARTICLES

more