반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
11-07 11:40
관리 메뉴

ImJay

[BOJ/Java] 6987. 월드컵 본문

알고리즘/BOJ - Java

[BOJ/Java] 6987. 월드컵

ImJay 2024. 2. 4. 17:09
반응형

[BOJ/Java] 6987. 월드컵

 

6987번: 월드컵

월드컵 조별 최종 예선에서는 6개국으로 구성된 각 조별로 동일한 조에 소속된 국가들과 한 번씩, 각 국가별로 총 5번의 경기를 치른다. 조별리그가 끝난 후, 기자가 보내온 각 나라의 승, 무승부

www.acmicpc.net


풀이

package edu.ssafy.im.BOJ.Gold.G4.No6987;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    int arr[][], match[][];
    int ans;

    public static void main(String[] args) throws IOException {
        new Main().sol();
    }

    private void sol() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        // 네 가지 결과에 대해 반복
        for (int t = 0; t < 4; t++) {
            String input = br.readLine(); // 입력을 한 줄 읽음
            StringTokenizer st = new StringTokenizer(input); // 공백을 기준으로 문자열을 분리하여 StringTokenizer 생성
            arr = new int[6][3]; // 6개국의 승, 무승부, 패의 수를 저장할 배열 생성
            ans = 1; // 결과 초기값을 1로 설정 (가능한 결과로 가정)
            
            // 각 나라의 승, 무승부, 패의 수 입력 받기
            for (int i = 0; i < 6; i++) {
                int sum = 0; // 각 나라의 승, 무승부, 패의 합을 저장할 변수 초기화
                for (int j = 0; j < 3; j++) {
                    arr[i][j] = Integer.parseInt(st.nextToken()); // 문자열을 정수로 변환하여 배열에 저장
                    sum += arr[i][j]; // 승, 무승부, 패의 수를 합하여 sum에 저장
                    // 1. 승, 무, 패가 5보다 큰 경우
                    if (arr[i][j] > 5) {
                        ans = 0; // 불가능한 결과로 판정
                        break; // 반복문 종료
                    }
                }
                // 2. 승, 무, 패의 합이 5가 아닌 경우
                if (sum != 5) {
                    ans = 0; // 불가능한 결과로 판정
                    break; // 반복문 종료
                }
            }

            if (ans == 1) { // 가능한 결과인 경우
                Arrays.sort(arr, (o1, o2) -> o2[0] - o1[0]); // 각 나라를 승수가 많은 순서로 정렬
                
                // 팀 매칭
                int idx = 0;
                match = new int[15][2]; // 팀 매칭 결과를 저장할 배열 생성
                for (int i = 0; i < 5; i++) {
                    for (int j = i + 1; j < 6; j++) {
                        match[idx][0] = i;
                        match[idx][1] = j;
                        idx++;
                    }
                }

                ans = 0; // 초기값을 불가능한 결과로 설정
                recursive(0); // 재귀 함수 호출하여 가능한 결과인지 판별
            }
            sb.append(ans).append(" "); // 결과를 StringBuilder에 추가
        }
        System.out.print(sb); // 결과 출력
    }

    // 가능한 결과를 판별하는 재귀 함수
    private void recursive(int matchCount) {
        // basis part
        if (ans == 1) { // 이미 가능한 결과가 판별된 경우
            return; // 함수 종료
        }

        if (matchCount == 15) { // 모든 경기가 종료된 경우
            ans = 1; // 가능한 결과로 판정
            return; // 함수 종료
        }

        // inductive part
        int i = match[matchCount][0]; // 현재 경기에서 우리팀의 인덱스
        int j = match[matchCount][1]; // 현재 경기에서 상대팀의 인덱스

        // 우리팀 승, 상대팀 패
        if (arr[i][0] > 0 && arr[j][2] > 0) { // 우리팀이 이기고 상대팀이 지는 경우
            arr[i][0]--; // 우리팀의 승수 감소
            arr[j][2]--; // 상대팀의 패수 감소
            recursive(matchCount + 1); // 다음 경기로 이동하여 재귀 호출
            arr[i][0]++; // 우리팀의 승수 원상복구
            arr[j][2]++; // 상대팀의 패수 원상복구
        }

        // 우리팀 무, 상대팀 무
        if (arr[i][1] > 0 && arr[j][1] > 0) { // 우리팀과 상대팀이 비기는 경우
            arr[i][1]--; // 우리팀의 무승부 수 감소
            arr[j][1]--; // 상대팀의 무승부 수 감소
            recursive(matchCount + 1); // 다음 경기로 이동하여 재귀 호출
            arr[i][1]++; // 우리팀의 무승부 수 원상복구
            arr[j][1]++; // 상대팀의 무승부 수 원상복구
        }

        // 우리팀 패, 상대팀 승
        if (arr[i][2] > 0 && arr[j][0] > 0) { // 우리팀이 지고 상대팀이 이기는 경우
            arr[i][2]--; // 우리팀의 패수 감소
            arr[j][0]--; // 상대팀의 승수 감소
            recursive(matchCount + 1); // 다음 경기로 이동하여 재귀 호출
            arr[i][2]++; // 우리팀의 패수 원상복구
            arr[j][0]++; // 상대팀의 승수 원상복구
        }
    }
}

 

반응형
Comments