ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ] 월드컵(JAVA)
    Algorithm/BOJ 2021. 1. 24. 17:18

    [6987] 월드컵

    www.acmicpc.net/problem/6987

     

    Solution

    • 국가별로 같은 조에 속한 나라들과 1번씩 총 5번의 경기를 치루기 때문에, matches 배열에 경기 순서를 미리 정의했다.
    • matches 배열에 순서대로 접근하면서 backtracking(count+1) 메서드를 dfs로 호출하고, 옳은 결과를 유지하면서 count==15가 되었을 때 탐색을 종료한다.
    • 총 15 번의 경기만 치루기 때문에 count==15까지 도달했다는 것은 모든 경기가 주어진 결과에 부합한다는 것을 의미한다.

     

     

    소스코드

     

    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
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.*;
     
    public class Main {
        static int[][] matches = {{01}, {02}, {03}, {04}, {05}, {12}, {13}, {14}, {15}, {23}, {24}, {25}, {34}, {35}, {45}};
        static int[][] result;
     
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringBuilder sb = new StringBuilder();
            StringTokenizer st;
            for (int i = 0; i < 4; i++) {
                result = new int[6][3];
     
                // input
                int sum = 0;
                st = new StringTokenizer(br.readLine());
                for (int j = 0; j < 6; j++) {
                    for (int k = 0; k < 3; k++) {
                        result[j][k] = stoi(st.nextToken());
                        sum += result[j][k];
                    }
                }
     
                boolean valid = backtracking(0);
                if (sum == 30 && valid) sb.append(1 + " ");
                else sb.append(0 + " ");
            }
            System.out.println(sb.toString().trim());
        }
     
        private static boolean backtracking(int count) {
            if (count == 15return true;
     
            // 승 : 패
            if (result[matches[count][0]][0> 0 && result[matches[count][1]][2> 0) {
                result[matches[count][0]][0]--;
                result[matches[count][1]][2]--;
                if (backtracking(count + 1)) return true;
                result[matches[count][0]][0]++;
                result[matches[count][1]][2]++;
            }
     
            // 무 : 무
            if (result[matches[count][0]][1> 0 && result[matches[count][1]][1> 0) {
                result[matches[count][0]][1]--;
                result[matches[count][1]][1]--;
                if (backtracking(count + 1)) return true;
                result[matches[count][1]][1]++;
                result[matches[count][0]][1]++;
            }
     
            // 패 : 승
            if (result[matches[count][0]][2> 0 && result[matches[count][1]][0> 0) {
                result[matches[count][0]][2]--;
                result[matches[count][1]][0]--;
                if (backtracking(count + 1)) return true;
                result[matches[count][1]][0]++;
                result[matches[count][0]][2]++;
            }
     
            return false;
        }
     
        private static int stoi(String s) {
            return Integer.parseInt(s);
        }
    }
     
     
    cs

    'Algorithm > BOJ' 카테고리의 다른 글

    [BOJ] 색종이 붙이기(JAVA)  (0) 2021.01.27
    [BOJ] 빵집(JAVA)  (0) 2021.01.25
    [BOJ] 근손실  (0) 2021.01.20
    [BOJ] 계란으로 계란치기  (0) 2021.01.20
    [BOJ] 청소년 상어  (0) 2021.01.19

    댓글

Designed by Tistory.