-
[BOJ] 월드컵(JAVA)Algorithm/BOJ 2021. 1. 24. 17:18
[6987] 월드컵
Solution
- 국가별로 같은 조에 속한 나라들과 1번씩 총 5번의 경기를 치루기 때문에, matches 배열에 경기 순서를 미리 정의했다.
- matches 배열에 순서대로 접근하면서 backtracking(count+1) 메서드를 dfs로 호출하고, 옳은 결과를 유지하면서 count==15가 되었을 때 탐색을 종료한다.
- 총 15 번의 경기만 치루기 때문에 count==15까지 도달했다는 것은 모든 경기가 주어진 결과에 부합한다는 것을 의미한다.
소스코드
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.*;public class Main {static int[][] matches = {{0, 1}, {0, 2}, {0, 3}, {0, 4}, {0, 5}, {1, 2}, {1, 3}, {1, 4}, {1, 5}, {2, 3}, {2, 4}, {2, 5}, {3, 4}, {3, 5}, {4, 5}};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];// inputint 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 == 15) return 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