|
| 1 | +```java |
| 2 | +import java.util.*; |
| 3 | + |
| 4 | +class Solution { |
| 5 | + static class BfsQElement { |
| 6 | + int count; |
| 7 | + ArrayDeque<Integer> q1; |
| 8 | + ArrayDeque<Integer> q2; |
| 9 | + long sum1; |
| 10 | + long sum2; |
| 11 | + |
| 12 | + BfsQElement(int count, ArrayDeque<Integer> q1, ArrayDeque<Integer> q2, long sum1, long sum2) { |
| 13 | + this.count = count; |
| 14 | + this.q1 = q1; |
| 15 | + this.q2 = q2; |
| 16 | + this.sum1 = sum1; |
| 17 | + this.sum2 = sum2; |
| 18 | + } |
| 19 | + } |
| 20 | + |
| 21 | + public int solution(int[] queue1, int[] queue2) { |
| 22 | + long total = 0; |
| 23 | + long sum1 = 0, sum2 = 0; |
| 24 | + |
| 25 | + var q1 = new ArrayDeque<Integer>(); |
| 26 | + var q2 = new ArrayDeque<Integer>(); |
| 27 | + |
| 28 | + for (int i : queue1) { |
| 29 | + q1.offer(i); |
| 30 | + sum1 += i; |
| 31 | + total += i; |
| 32 | + } |
| 33 | + for (int i : queue2) { |
| 34 | + q2.offer(i); |
| 35 | + sum2 += i; |
| 36 | + total += i; |
| 37 | + } |
| 38 | + if (total % 2 != 0) |
| 39 | + return -1; |
| 40 | + long target = total / 2; |
| 41 | + var bfsQ = new ArrayDeque<BfsQElement>(); |
| 42 | + bfsQ.offer(new BfsQElement(0, q1, q2, sum1, sum2)); |
| 43 | + |
| 44 | + Set<String> visited = new HashSet<>();//방문상태 |
| 45 | + visited.add(sum1 + "," + sum2); |
| 46 | + |
| 47 | + while (!bfsQ.isEmpty()) { |
| 48 | + BfsQElement cur = bfsQ.poll(); |
| 49 | + |
| 50 | + if (cur.sum1 == target) { |
| 51 | + return cur.count; |
| 52 | + } |
| 53 | + |
| 54 | + if (!cur.q1.isEmpty()) { |
| 55 | + int val = cur.q1.peek(); |
| 56 | + var newQ1 = new ArrayDeque<>(cur.q1); |
| 57 | + var newQ2 = new ArrayDeque<>(cur.q2); |
| 58 | + newQ1.poll(); |
| 59 | + newQ2.offer(val); |
| 60 | + |
| 61 | + long newSum1 = cur.sum1 - val; |
| 62 | + long newSum2 = cur.sum2 + val; |
| 63 | + String key = newSum1 + "," + newSum2; |
| 64 | + |
| 65 | + if (!visited.contains(key)) { |
| 66 | + visited.add(key); |
| 67 | + bfsQ.offer(new BfsQElement(cur.count + 1, newQ1, newQ2, newSum1, newSum2)); |
| 68 | + } |
| 69 | + } |
| 70 | + |
| 71 | + if (!cur.q2.isEmpty()) { |
| 72 | + int val = cur.q2.peek(); |
| 73 | + var newQ1 = new ArrayDeque<>(cur.q1); |
| 74 | + var newQ2 = new ArrayDeque<>(cur.q2); |
| 75 | + newQ2.poll(); |
| 76 | + newQ1.offer(val); |
| 77 | + |
| 78 | + long newSum1 = cur.sum1 + val; |
| 79 | + long newSum2 = cur.sum2 - val; |
| 80 | + String key = newSum1 + "," + newSum2; |
| 81 | + |
| 82 | + if (!visited.contains(key)) { |
| 83 | + visited.add(key); |
| 84 | + bfsQ.offer(new BfsQElement(cur.count + 1, newQ1, newQ2, newSum1, newSum2)); |
| 85 | + } |
| 86 | + } |
| 87 | + } |
| 88 | + |
| 89 | + return -1; |
| 90 | + } |
| 91 | +} |
| 92 | +``` |
0 commit comments