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 |