본문 바로가기

PS/boj

백준 6987 월드컵

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

 

6987번: 월드컵

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

www.acmicpc.net

완전 탐색을 통해 푸는 문제였습니다.

총 6개국으로 구성된 팀이 서로 한번씩은 경기를 해야합니다. 따라서 6*5/2 = 15 번의 경기를 가지게 됩니다.

O(3^15)시간 복잡도는 문제에서 제시한 시간제한을 만족합니다. 따라서 완전탐색을 통해 해결할 수 있습니다.

하지만 완전탐색이지만 좀 더 시간을 단축할 수 있는 여지가 있습니다. 저는 처음에 모든 경우의 수를 탐색한 후 

각 경우의 수를 문제에서 제시한 4가지 예제랑 비교하는 방식을 사용했습니다. 대략 600ms라는 많은 시간이 걸렸습니다.

맞으신 분들의 코드를 살펴봤을때 예제부터 시작해서 각 경기의 결과마다 승,무,패에 해당하는 부분을 빼주면서 만약 -1이 되는경우 이 후 탐색하지 않는 백트래킹 방식을 사용하여 시간을 단축하신 것을 확인했습니다. 이를 참고하여 다시 제출하여 풀어 시간을 단축할 수 있엇습니다.

#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;
int arr[6][3];
int sum[3];
bool solve;
void dfs(int a,int b){
    if(a==5){
        solve=true;
        return;
    }
    for(int x=0;x<3;x++){
        arr[a][x]--;
        arr[b][2-x]--;
        if(arr[a][x]>=0 && arr[b][2-x]>=0){
            if(b==5){
                dfs(a+1,a+2);
            }
            else{
                dfs(a,b+1);
            }
        }
        arr[a][x]++;
        arr[b][2-x]++;
    }
}
int main(){
    for(int test=0;test<4;test++){
        for(int x=0;x<3;x++) sum[x]=0;
        solve=false;
        for(int x=0;x<6;x++){
            for(int y=0;y<3;y++){
                cin>>arr[x][y];
                sum[y]+=arr[x][y];
            }
        }
        dfs(0,1);
        if(sum[0]!=sum[2] || 30-sum[1] != sum[0]+sum[2]) solve=false;
        cout<<solve<<" ";
    }
}

 

'PS > boj' 카테고리의 다른 글

백준 24229 모두싸인 출근길  (0) 2023.01.04
백준 20168 골목 대장 호석 - 기능성  (0) 2023.01.03
백준 16965 구간과 쿼리  (0) 2023.01.01
백준 16719 ZOAC  (0) 2022.09.11
백준 2026 소풍  (0) 2022.09.01