본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 6987 월드컵

by 까망 하르방 2021. 2. 25.
반응형

출처https://www.acmicpc.net/problem/6987

 Input 

5 0 0 3 0 2 2 0 3 0 0 5 4 0 1 1 0 4

4 1 0 3 0 2 4 1 0 1 1 3 0 0 5 1 1 3

5 0 0 4 0 1 2 2 1 2 0 3 1 0 4 0 0 5

5 0 0 3 1 1 2 1 2 2 0 3 0 0 5 1 0 4

 

 Output 

1 1 0 0

단순히 이긴 횟수, 비긴 횟수, 패배한 횟수만을 비교해서 답을 구할 수 없습니다.

C 팀이 다른 누군가와 비겼다는 것은 상대방 전적에도 비긴 횟수가 있어야 하기 때문입니다.

승/패 역시 마찬가지로 누군가가 이겼다면 다른 상대방은 졌다는 것을 의미합니다.

 

① 6개팀이 승부하는 경우의 수는 15가지입니다.

A: {B, C, D, E, F}

B: {C, D, E, F}

C: {D, E, F}

D: {E, F}

E: {F}

 

② team 1 vs team 2의 결과는 3가지 입니다.

- 승리 / 패배

- 무승부

- 패배 / 승리

▶O(315)으로 각각의 수를 모두 구해서 입력받은 Case가 가능한지 확인합니다.


#include <iostream>
using namespace std;
 
const int team1[] = { 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4 };
const int team2[] = { 1, 2, 3, 4, 5, 2, 3, 4, 5, 3, 4, 5, 4, 5, 5 };
int answer[4], match[6][3], result[6][3];
 
void DFS(int tc, int round){
    // 15개 경기 종료
    if(round == 15){
        // 이미 가능한 경우로 판단된 경우
        if(answer[tc]) return;
 
        for (int r = 0; r < 6; r++) {
            for (int c = 0; c < 3; c++){
                // 예측 한 곳이라도 맞지 않는 경우
                if(match[r][c] != result[r][c])
                    return;
            }
        }
                
        // 모든 예측이 일치한다면 가능한 결과로 처리
        answer[tc] = 1;
        return;
    }
            
    // {승리(0), 무승부(1), 패배(2)}
    int t1 = team1[round];
    int t2 = team2[round];
 
    // t1 승, t2 패
    result[t1][0]++; result[t2][2]++;
    DFS(tc, round + 1);
    result[t1][0]--; result[t2][2]--;
 
    // t1 무, t2 무
    result[t1][1]++; result[t2][1]++;
    DFS(tc, round + 1);
    result[t1][1]--; result[t2][1]--;
 
    // t1 패, t2 승
    result[t1][2]++; result[t2][0]++;
    DFS(tc, round + 1);
    result[t1][2]--; result[t2][0]--;
}
 
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    for(int TC=0; TC<4; ++TC){
        for(int r=0; r<6; ++r){
            for(int c=0; c<3; c++){
                cin >> match[r][c];
            }
        }
        DFS(TC, 0);
    }
 
    for(int i=0; i<4; i++)
        cout << answer[i] << ' ';
    cout << "\n";
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 3090 차이를 최소로  (0) 2021.02.25
[BOJ] 백준 2613 숫자 구슬  (0) 2021.02.25
[BOJ] 백준 2935 소음  (0) 2021.02.25
[BOJ] 백준 2822 점수 계산  (0) 2021.02.25
[BOJ] 백준 14225 부분수열의 합  (0) 2021.02.25

댓글