본문 바로가기

Computer Science&Engineering/코딩테스트

[ 백준 12886 ] 돌 그룹 (C++)

# 문제링크

www.acmicpc.net/problem/12886

 

12886번: 돌 그룹

오늘 강호는 돌을 이용해 재미있는 게임을 하려고 한다. 먼저, 돌 세개는 그룹으로 나누어져 있으며 각각의 그룹에는 돌이 A, B, C개가 있다. 강호는 모든 그룹에 있는 돌의 개수를 같게 만들려고

www.acmicpc.net

10 15 35 나, 15 10 35 나, 35 10 15나,,,, 같은 숫자 구성이다. 어차피 같은 숫자 구성인데 각각 진행시켜 줄 필요가 없다. 세 수를 오름차순으로 정렬해서 체크를 재주면 visited[500][500][500] 에 체크를 다 해줄 수 있다.

 

세 수의 비교 코드,, C언어 배울 때 if else 문 chapter 에서 국룰이었는데.. 그 때 생각하며 if else 를 열씸히 적었다.. 배열로 만들어서 정렬하면 편하겠다고 생각을 했는데, DFS에서 직접 배열에 담아서 진행을 시키는 게 또 복잡하게 느껴졌다.. 막 배열에서 더했다가 뺐다가 그러는게 귀찮은 것 같아서 그냥 세 수의 비교 코드를 짰다..

 

엄청난 노가다? 코드.. 나의 장인정신이 느껴지는가......ㅎ.ㅠ.ㅠㅎ.ㅠ

 

# 제출 코드 

 

#include <cstdio>
using namespace std;

int A, B, C;
bool visited[500][500][500];

// 오름차순 정렬 
void Sort(int* a, int* b, int* c) {
	int aa = *a; int bb = *b; int cc = *c;

	if (*a > *b) {
		if (*b > *c) {
			*a = cc;
			*c = aa;
		}
		else if(*a > *c){
			*a = bb;
			*b = cc;
			*c = aa;
		}
		else {
			*a = bb;
			*b = aa;
		}
	}
	else {
		if (*a > *c) {
			*a = cc;
			*b = aa;
			*c = bb;
		}
		else if (*b > *c) {
			*b = cc;
			*c = bb;
		}
	}
	return;
}

bool DFS(int a, int b, int c) {
	Sort(&a, &b, &c);
	if (a == b && b == c) return true;
	if (visited[a][b][c]) return false;
	visited[a][b][c] = true;

	if (a < b) {
		if(DFS(a + a, b - a, c))return true;
	}
	if (a < c) {
		if(DFS(a + a, b, c - a)) return true;

	}
	if (b < c) {
		if(DFS(a, b + b, c - b)) return true;
	}
	return false;
}

int main() {
	scanf("%d %d %d", &A, &B, &C);
	printf("%d\n", DFS(A, B, C));
}
반응형