문제풀이/백준oj

[백준OJ] 6987번 월드컵

Hyeon-Uk 2021. 8. 14. 03:03
반응형

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

 

6987번: 월드컵

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

www.acmicpc.net


 

풀이

매칭이 되었을때, A팀 WIN, B팀 LOSE / A,B팀 DRAW / A팀 LOSE B팀 WIN 인 경우를 각각 고려해주며, 모든 경기를 완전탐색한 뒤, 입력받았던 4가지 경우와 비교하여 일치하는것이 있으면, 해당 INDEX의 RESULT값을 1로 바꾸어준다.

 

초반에 계속 틀렸는데, 틀린 이유가 4가지 경우가 모두 다른 입력인줄알고 풀었다. 4가지경우 모두 같은 입력이 들어올 경우를 생각해주며 코드를 짜면된다.

 

코드

#include <iostream>
#include<algorithm>
using namespace std;

int team[6][3] = { 0 };//매순간 상태를 저장하는 배열
int arr[4][6][3];//입력받은거 저장하는 배열
int result[4] = { 0 };//결과 저장 배열

//매칭되는 경우를 모두 저장
pair<int, int> game[15] = { 
	{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} 
};

void dfs(int cnt) {	

	//6명이서 토너먼트하면 총 15게임을 함
	if (cnt == 15) {
		//비교
		for (int k = 0; k < 4; k++) {
			bool flag = true;
			for (int i = 0; i < 6; i++) {
				for (int j = 0; j < 3; j++) {
					if (team[i][j] != arr[k][i][j]) {
						flag = false;
						break;
					}
				}
				if (!flag) break;
			}
			if (flag) {
				result[k] = 1;
			}
		}
		return;
	}

	//i팀과 j팀의 경기
	int i = game[cnt].first;
	int j = game[cnt].second;

	//승
	team[i][0]++;
	team[j][2]++;
	dfs(cnt + 1);
	team[i][0]--;
	team[j][2]--;

	//무승부
	team[i][1]++;
	team[j][1]++;
	dfs(cnt + 1);
	team[i][1]--;
	team[j][1]--;

	//패
	team[i][2]++;
	team[j][0]++;
	dfs(cnt + 1);
	team[i][2]--;
	team[j][0]--;
		
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	for (int k = 0; k < 4; k++) {
		for (int i = 0; i < 6; i++) {
			for (int j = 0; j < 3; j++) {
				cin >> arr[k][i][j];
			}
		}
	}
	dfs(0);
	for (int ret:result) {
		cout << ret << " ";
	}
	return 0;
}

 

반응형