이번에 풀어본 문제는
프로그래머스 롤케이크 자르기 입니다.
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
class Solution {
public int solution(int[] topping) {
int answer = 0;
int toppingSize = topping.length;
Set<Integer> left = new HashSet<>();
Map<Integer, Integer> right = new HashMap<>();
left.add(topping[0]);
for (int i = 1; i < toppingSize; i++) right.put(topping[i], right.getOrDefault(topping[i], 0) + 1);
// 초기값 확인
if (left.size() == right.size()) answer++;
for (int i = 1; i < toppingSize; i++) {
int next = topping[i];
// 왼쪽 추가
left.add(next);
// 오른쪽 감소 or 제거
decreaseOrRemove(right, next);
if (left.size() == right.size()) answer++;
}
return answer;
}
static void decreaseOrRemove(Map<Integer, Integer> map, int key) {
int currentValue = map.get(key);
if (currentValue == 1) map.remove(key);
else map.put(key, map.get(key) - 1);
}
}
각 토핑의 개수가 아닌 토핑의 가짓수만 비교하면 되는 문제입니다.
따라서, HashMap에 두 형제의 토핑 보유 상태를 저장했을 때, key값의 개수 즉 HashMap의 크기만 비교하면 공평한지 여부를 확인할 수 있습니다.
저의 경우 첫 번째 인덱스를 동생에게 준 상태를 시작으로 한 칸씩 늘려나가며 동생에게 토핑을 추가하는 로직을 구성했기 때문에, 동생 쪽은 value가 중요하지 않았습니다. 따라서 동생은 HashSet을 사용하는 방향으로 풀이해보았습니다.