주어진 정수 배열에서 특정 지점을 기준으로 양 쪽 원소들의 종류가 같으면 그 지점을 공평하게 자른 지점이라 지칭합니다. 이 때 공평하게 자를 수 있는 지점이 몇 개인지 구하는 문제입니다.
두 dictionary를 만들어, 양 쪽의 값을 갱신하며 size를 비교하는 방식으로 풀었습니다. 우선 back에 값을 전부 넣어두고, topping을 읽으며 forth에 값을 추가할건데, back에서 원소의 개수가 0이 되면 size를 줄일 수 있도록 remove 해주도록 합니다. 한편 forth에는 굳이 value를 정확히 유지할 필요가 없습니다.(Set을 써도 되겠네요)
forth의 size가 back보다 커지면 불필요한 계산을 막기 위해 break 해줍니다.
import java.util.*;
class Solution {
public int solution(int[] topping) {
HashMap<Integer, Integer> forth = new HashMap<>();
HashMap<Integer, Integer> back = new HashMap<>();
int answer = 0;
for (int t : topping) {
if (back.get(t) == null) {
back.put(t, 1);
continue;
}
back.put(t, back.get(t) + 1);
}
for (int t : topping) {
int cur = back.get(t);
if (cur == 1) {
back.remove(t);
} else {
back.put(t, cur - 1);
}
if (forth.get(t) == null) {
forth.put(t, 1);
}
if (compare(forth, back) < 0) {
break;
}
answer += compare(forth, back);
}
return answer;
}
public int compare(HashMap<Integer, Integer> forth, HashMap<Integer, Integer> back) {
int f = forth.size();
int b = back.size();
if (f == b) {
return 1;
}
if (f > b) {
return -1;
}
return 0;
}
}