diff --git "a/LiiNi-coder/202508/20 PGM \353\221\220 \355\201\220 \355\225\251 \352\260\231\352\262\214 \353\247\214\353\223\244\352\270\260.md" "b/LiiNi-coder/202508/20 PGM \353\221\220 \355\201\220 \355\225\251 \352\260\231\352\262\214 \353\247\214\353\223\244\352\270\260.md" new file mode 100644 index 00000000..d5232ad4 --- /dev/null +++ "b/LiiNi-coder/202508/20 PGM \353\221\220 \355\201\220 \355\225\251 \352\260\231\352\262\214 \353\247\214\353\223\244\352\270\260.md" @@ -0,0 +1,92 @@ +```java +import java.util.*; + +class Solution { + static class BfsQElement { + int count; + ArrayDeque q1; + ArrayDeque q2; + long sum1; + long sum2; + + BfsQElement(int count, ArrayDeque q1, ArrayDeque q2, long sum1, long sum2) { + this.count = count; + this.q1 = q1; + this.q2 = q2; + this.sum1 = sum1; + this.sum2 = sum2; + } + } + + public int solution(int[] queue1, int[] queue2) { + long total = 0; + long sum1 = 0, sum2 = 0; + + var q1 = new ArrayDeque(); + var q2 = new ArrayDeque(); + + for (int i : queue1) { + q1.offer(i); + sum1 += i; + total += i; + } + for (int i : queue2) { + q2.offer(i); + sum2 += i; + total += i; + } + if (total % 2 != 0) + return -1; + long target = total / 2; + var bfsQ = new ArrayDeque(); + bfsQ.offer(new BfsQElement(0, q1, q2, sum1, sum2)); + + Set visited = new HashSet<>();//방문상태 + visited.add(sum1 + "," + sum2); + + while (!bfsQ.isEmpty()) { + BfsQElement cur = bfsQ.poll(); + + if (cur.sum1 == target) { + return cur.count; + } + + if (!cur.q1.isEmpty()) { + int val = cur.q1.peek(); + var newQ1 = new ArrayDeque<>(cur.q1); + var newQ2 = new ArrayDeque<>(cur.q2); + newQ1.poll(); + newQ2.offer(val); + + long newSum1 = cur.sum1 - val; + long newSum2 = cur.sum2 + val; + String key = newSum1 + "," + newSum2; + + if (!visited.contains(key)) { + visited.add(key); + bfsQ.offer(new BfsQElement(cur.count + 1, newQ1, newQ2, newSum1, newSum2)); + } + } + + if (!cur.q2.isEmpty()) { + int val = cur.q2.peek(); + var newQ1 = new ArrayDeque<>(cur.q1); + var newQ2 = new ArrayDeque<>(cur.q2); + newQ2.poll(); + newQ1.offer(val); + + long newSum1 = cur.sum1 + val; + long newSum2 = cur.sum2 - val; + String key = newSum1 + "," + newSum2; + + if (!visited.contains(key)) { + visited.add(key); + bfsQ.offer(new BfsQElement(cur.count + 1, newQ1, newQ2, newSum1, newSum2)); + } + } + } + + return -1; + } +} +```