https://leetcode.com/problems/fair-candy-swap/
엘리스와 밥은 여러 개의 사탕이 든 상자를 가지고 있다. 이 때, 서로가 가진 상자를 교환한 뒤 각자가 가진 사탕의 총합이 같아지도록 만들어야 한다.
이를 위해서는 엘리스가 가진 사탕의 합을 alice
, 밥이 가진 사탕의 합을 bob
, 교환할 상자를 각각 a
, b
라고 했을 때, 다음과 같은 공식이 성립하는 a
와 b
를 찾아야 한다.
alice - a + b = bob - b + a
사실상 이 공식만 유추할 수 있으면 쉽게 해결할 수 있는 문제라서 자바의 스트림을 연습하려고 어떻게든 쓰기는 했는데, 코드가 깔끔하지는 않다.
더 공부해서 예쁘게 코드를 작성해야겠다...
class Solution {
public int[] fairCandySwap(int[] aliceSizes, int[] bobSizes) {
boolean[] bobCandy = new boolean[100001];
int alice = Arrays.stream(aliceSizes).sum();
int bob = Arrays.stream(bobSizes).peek(b -> bobCandy[b] = true).sum();
int answer = Arrays.stream(aliceSizes).filter(a -> a - (alice - bob) / 2 > 0 && a - (alice - bob) / 2 <= 100000).
filter(a -> bobCandy[a - (alice - bob) / 2]).findFirst().getAsInt();
return new int[]{answer, answer - (alice - bob) / 2};
}
}
https://leetcode.com/submissions/detail/592008885/
https://github.com/sorious77/LeetCode/blob/main/code/888.java