반응형
12-24 00:25
Today
Total
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
관리 메뉴

개발하는 고라니

[백준] 12886번 : 돌 그룹 본문

Programming/백준

[백준] 12886번 : 돌 그룹

조용한고라니 2021. 5. 2. 04:06
반응형
 

12886번: 돌 그룹

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

www.acmicpc.net


[BFS]

브루트포스로 푼다면 문제 자체의 난이도는 비교적 간단한 편이나, 브루트 포스로 푼다면 메모리 소모가 엄청나므로 최대한 효율적인 방법으로 중복 점을 제거하여야 한다. 여러 방법이 있을 수 있다.

 

나는 정렬을 사용했다. 브루트 포스를 사용한다면 방문을 체크하는 정점 배열을 [1501][1501][1501] 만큼의 배열을 사용해야하지만, 정렬을 사용하면 [501][1001][1501] 정도의 크기로 줄일 수 있다. 돌의 개수는 최대 1500개를 넘지 않으니 말이다.

# Code </>

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;

public class Main {

    static boolean[][][] visit = new boolean[501][1001][1501];

    static int BFS(int[] start){
        Queue<int[]> Q = new LinkedList<>();

        visit[start[0]][start[1]][start[2]] = true;
        Q.add(start);

        while(!Q.isEmpty()){
            int[] val = Q.poll();

            if(val[0] == val[2]) return 1;

            for(int a=0; a<3; a++){
                int[] nVal = {val[0], val[1], val[2]};
                int cur = a;
                int next = (cur+1) % 3;

                if(nVal[cur] == nVal[next]) continue;
                if(next == 0){
                    cur = 0;
                    next = 2;
                }

                nVal[next] -= nVal[cur];
                nVal[cur] *= 2;

                Arrays.sort(nVal);
                if(!visit[nVal[0]][nVal[1]][nVal[2]]){
                    visit[nVal[0]][nVal[1]][nVal[2]] = true;
                    Q.add(nVal);
                }
            }
        }
        return 0;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int[] val = new int[3];
        for(int i=0; i<3; i++)
            val[i] = Integer.parseInt(st.nextToken());

        Arrays.sort(val);
        System.out.println(BFS(val));
    }
}
반응형

'Programming > 백준' 카테고리의 다른 글

[백준] 16768번 : Mooyo Mooyo  (0) 2021.05.08
[백준] 17244번 : 아맞다우산  (0) 2021.05.06
[백준] 14950번 : 정복자  (0) 2021.05.02
[백준] 2562번 : 최댓값  (0) 2021.05.01
[백준] 16929번 : Two Dots  (0) 2021.05.01
Comments