본문 바로가기

ProgramSoliving

백준 : 12886

반응형

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

 

12886번: 돌 그룹

오늘 강호는 돌을 이용해 재미있는 게임을 하려고 한다. 먼저, 돌 세개는 그룹으로 나누어져 있으며 각각의 그룹에는 돌이 A, B, C개가 있다. 강호는 모든 그룹에 있는 돌의 개수를 같게 만들려고 한다. 강호는 돌을 단계별로 움직이며, 각 단계는 다음과 같이 이루어져 있다. 크기가 같지 않은 두 그룹을 고른다. 그 다음, 돌의 개수가 작은 쪽을 X, 큰 쪽을 Y라고 정한다. 그 다음, X에 있는 돌의 개수를 X+X개로, Y에 있는 돌의 개수를 Y-X개로

www.acmicpc.net

 

boolean 형을 잘못생각하면 1000 1000 1000 구조로 해야하나 생각 할수 있다.

이렇게 제출하면 메모리초과 오류를 발생시킨다.

따라서 문제를 자세히보면 a b c 의 총량은 항상 일정하다는것을 알수있다. 따라서 2개의 값이정해지면 나머지하나의 값은 전체에서 두개를 빼주는 아이디어로 메로리초과를 방지할수가있다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
 
import java.util.Scanner;
 
public class B12886 {
    static int Answer = 0;
 
    static class Pair {
        int a;
        int b;
 
        public Pair(int a, int b) {
            super();
            this.a = a;
            this.b = b;
        }
    }
 
    static int sum = 0;
    static boolean visit[][] = new boolean[1001][1001];
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = sc.nextInt();
 
        sum = a + b + c;
        Solve(a, b);
        System.out.println(Answer);
    }
 
    public static void Solve(int a, int b) {
        if (sum % 3 != 0)
            return;
 
        BFS(a, b);
    }
 
    public static void BFS(int a, int b) {
        Queue<Pair> q = new LinkedList<>();
        q.add(new Pair(a, b));
        visit[a][b] = true;
 
        while (!q.isEmpty()) {
            Pair cur = q.poll();
            int x = cur.a;
            int y = cur.b;
            int z = sum - x - y;
            if (x == y && y == z) {
                Answer = 1;
                break;
            }
 
            if (x > y) {
                if (y + y <= 1000 && !visit[x - y][y + y]) {
                    visit[x - y][y + y] = true;
                    q.add(new Pair(x - y, y + y));
                }
            }
 
            if (x < y) {
                if (x + x <= 1000 && !visit[x + x][y - x]) {
                    visit[x + x][y - x] = true;
                    q.add(new Pair(x + x, y - x));
                }
            }
 
            if (x > z) {
                if (z + z <= 1000 && !visit[z + z][x - z]) {
                    visit[z + z][x - z] = true;
                    q.add(new Pair(z + z, x - z));
                }
            }
 
            if (x < z) {
                if (x + x <= 1000 && !visit[x + x][z - x]) {
                    visit[x + x][z - x] = true;
                    q.add(new Pair(x + x, z - x));
                }
            }
 
            if (y > z) {
                if (z + z <= 1000 && !visit[z + z][y - z]) {
                    visit[z + z][y - z] = true;
                    q.add(new Pair(z + z, y - z));
                }
            }
 
            if (y < z) {
                if (y + y <= 1000 && !visit[y + y][z - y]) {
                    visit[y + y][z - y] = true;
                    q.add(new Pair(y + y, z - y));
                }
            }
        }
 
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 1637  (0) 2020.04.15
백준 : 5213 JAVA  (0) 2020.03.17
백준 : 1086 JAVA  (0) 2020.03.14
백준 : 16946  (0) 2020.03.11
백준 : 10217  (0) 2020.03.08