백준 12886 돌 그룹 (Java,자바)

jonghyukLee·2021년 12월 22일
0

이번에 풀어본 문제는
백준 12886번 돌 그룹 입니다.

📕 문제 링크

❗️코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

class Stone
{
    int a,b,c;

    public Stone(int a, int b, int c)
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }
}
public class Main {
    static boolean [][] visited;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int [] stones = new int[3];
        int tmp_tot = 0;
        for(int i = 0; i < 3; ++i)
        {
            int n = Integer.parseInt(st.nextToken());
            stones[i] = n;
            tmp_tot += n;
        }

        if((tmp_tot % 3) != 0)
        {
            System.out.print(0);
            return;
        }
        visited = new boolean[1501][1501];
        Arrays.sort(stones);
        Queue<Stone> q = new LinkedList<>();
        q.add(new Stone(stones[0],stones[1],stones[2]));

        int answer = 0;
        while(!q.isEmpty())
        {
            Stone cur = q.poll();

            if(cur.a == cur.b && cur.b == cur.c)
            {
                answer = 1;
                break;
            }

            if(cur.a != cur.b)
            {
                int min = cur.a;
                int max = cur.b;

                if(cur.a > cur.b)
                {
                    min = cur.b;
                    max = cur.a;
                }

                if(visited[min][max]) continue;
                visited[min][max] = true;
                max -= min;
                min *= 2;
                q.add(new Stone(min,max,cur.c));
            }

            if(cur.a != cur.c)
            {
                int min = cur.a;
                int max = cur.c;

                if(cur.a > cur.c)
                {
                    min = cur.c;
                    max = cur.a;
                }

                if(visited[min][max]) continue;
                visited[min][max] = true;
                max -= min;
                min *= 2;
                q.add(new Stone(min,max,cur.b));
            }

            if(cur.b != cur.c)
            {
                int min = cur.b;
                int max = cur.c;

                if(cur.b > cur.c)
                {
                    min = cur.c;
                    max = cur.b;
                }

                if(visited[min][max]) continue;
                visited[min][max] = true;
                max -= min;
                min *= 2;
                q.add(new Stone(min,max,cur.a));
            }
        }
        System.out.print(answer);
    }
}

📝 풀이

3가지 숫자를 입력받아, 그 숫자를 같게 분배할 수 있는지 찾는 문제입니다.
우선 무조건 안되는 경우의 수를 찾아보면, 3개의 숫자를 더해서 3으로 나누어 떨어지지 않는다면 당연히 성립될 수가 없는 경우이기 때문에, 입력 이후에 한번 체크해줍니다.
위의 경우가 아니라면 A,B,C의 숫자들을 AB, BC, AC의 3가지 묶음으로 비교하여 분배할 수 있기 때문에 큐에 담긴 3가지의 숫자들을 위의 3가지 경우의 수로 나누어 다시 큐에 담아줍니다. 방문배열을 활용하여 중복된 반복을 제거해주고, 세 숫자의 값이 같아졌을 때 반복문을 벗어나고 answer를 출력해주면 해결됩니다.

📜 후기

코드가 뭔가 이쁘지 않아서 다른 방법을 찾아보려했는데, 딱히 다른 방법이 생각나지 않아 있는그대로 해결해보았습니다.ㅠ

profile
머무르지 않기!

0개의 댓글