Map<String, List<Integer>> map = new HashMap<>();map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
value 기준 최댓값 찾기:
int maxKey = -1;int maxValue = Integer.MIN_VALUE;for (Map.Entry<Integer, Integer> e : map.entrySet()) { int key = e.getKey(); int value = e.getValue(); if (value > maxValue) { maxValue = value; maxKey = key; }}
누적합 / 슬라이딩 윈도우
Example
합이 k인 부분 배열 개수는 누적합 + HashMap으로 푼다.
Map<Integer, Integer> count = new HashMap<>();int sum = 0;int answer = 0;count.put(0, 1);for (int x : arr) { sum += x; answer += count.getOrDefault(sum - k, 0); count.put(sum, count.getOrDefault(sum, 0) + 1);}
핵심:
현재 누적합 - 이전 누적합 = k이전 누적합 = 현재 누적합 - k
슬라이딩 윈도우에서 빈도수 관리:
Map<Character, Integer> map = new HashMap<>();int left = 0;for (int right = 0; right < s.length(); right++) { char r = s.charAt(right); map.put(r, map.getOrDefault(r, 0) + 1); while (/* 조건 위반 */) { char l = s.charAt(left); map.put(l, map.get(l) - 1); if (map.get(l) == 0) { map.remove(l); } left++; }}
주의점
Warning
이것만 조심하면 된다.
실수
주의
HashMap, HashSet 순서 믿기
순서 보장 안 됨
containsValue() 남발
보통 O(N)
map.get(x) - 1
key 없으면 NPE 가능
빈도수 0인 key 유지
map.size() 판단 시 오류 가능
순회 중 map.remove()
Iterator.remove() 사용
배열을 key로 사용
내용 기준 비교 안 됨
좌표 key를 그냥 붙이기
1,23과 12,3 충돌 주의
좌표나 상태는 문자열 key로 만드는 게 가장 간단하다.
String key = r + "," + c;set.add(key);map.put(key, value);
정렬이나 순서가 필요할 때만 아래를 쓴다.
TreeSet<Integer> set = new TreeSet<>(); // 값 정렬TreeMap<Integer, Integer> map = new TreeMap<>(); // key 정렬LinkedHashSet<Integer> set = new LinkedHashSet<>(); // 입력 순서 유지LinkedHashMap<Integer, Integer> map = new LinkedHashMap<>();
추가 주의점
Warning
누적합 key와 경우의 수는 int를 넘을 수 있다.
부분합 문제는 Map<Long, Long>을 먼저 의심한다.