Programming/Algorithms

[12886번] 돌 그룹

찐공log 2023. 2. 18. 11:47

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

 

12886번: 돌 그룹

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

www.acmicpc.net

돌 그룹 3가지가 있는데 이 3가지 그룹의 돌 개수를 같게 할 수 있는지를 찾는 문제입니다.

각 그룹의 돌 개수를 정점이라고 생각하면 BFS로 풀 수 있습니다.

점화식은 d[a][b][c]로 정할 수 있는데, 전체 돌 개수를 구한 sum = a + b + c 값을 이용하면 굳이 3차원 배열이 아닌 d[a][b]인 2차원 배열으로도 문제를 해결 할 수 있습니다.

 

점화식 d[i][j] : 첫 번째 그룹의 돌의 수 i개, 두 번째 그룹의 돌의 수가 j개를 만들 수 있으면 true, 아직 만든 적이 없다면 false로 저장을 합니다.

BFS를 하기전에 sum을 3으로 나누어 떨어지지 않는다면 세 그룹의 돌 개수가 같아질 수 없으므로 그냥 0을 출력하고 종료합니다.

큐에 정점의 정보를 넣을 때는 세번째 그룹은 연산으로 처리가 가능하기 때문에 2개의 그룹의 돌 개수만 넣습니다.

정답은 모든 돌 개수가 sum/3인 정점을 방문해야 하므로 d[sum/3][sum/3]에 있습니다.

 

[코드]

#include <iostream>
#include <queue>
using namespace std;
bool d[1501][1501];
int sum;
int main () {
    int a, b, c;
    cin >> a >> b >> c;
    sum = a + b + c;
    if (sum % 3 != 0) {
        cout << 0 << '\n';
        return 0;
    }
    queue<pair<int, int>> q;
    q.push(make_pair(a, b));
    d[a][b] = true;
    while (!q.empty()) {
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        int z = sum - x - y;
        if (x > y) {
            x = x - y;
            y = y + y;
            if (d[x][y]) continue;
            q.push(make_pair(x, y));
            d[x][y] = true;
        } else if (x < y) {
            y = y - x;
            x = x + x;
            if (d[x][y]) continue;
            q.push(make_pair(x, y));
            d[x][y] = true;
        }
        if (x > z) {
            x = x - z;
            z = z + z;
            if (d[x][sum - x - z]) continue;
            q.push(make_pair(x, sum - x - z));
            d[x][sum - x - z] = true;
        } else if (x < z){
            z = z - x;
            x = x + x;
            if (d[x][sum - x - z]) continue;
            q.push(make_pair(x, sum - x - z));
            d[x][sum - x - z] = true;
        }
        if (y > z) {
            y = y - z;
            z = z + z;
            if (d[x][sum - y - z]) continue;
            q.push(make_pair(sum - y - z, y));
            d[sum - y - z][y] = true;
        } else if (z < y) {
            y = y - z;
            z = z + z;
            if (d[x][sum - y - z]) continue;
            q.push(make_pair(sum - y - z, y));
            d[sum - y - z][y] = true;
        }
    }
    if (d[sum/3][sum/3]) {
        cout << 1 << '\n';
    } else {
        cout << 0 << '\n';
    }
    return 0;
}

[결과]

1 1 2 //input
0 //output

 

'Programming > Algorithms' 카테고리의 다른 글

[16932번] 모양 만들기  (0) 2023.03.21
[5014번] 스타트링크  (0) 2023.02.17
[12865번] 평범한 배낭  (2) 2023.01.18
[13549번] 숨바꼭질 3  (0) 2022.07.11