Given an array a that contains only numbers in the range from 1 to a.length, find the first duplicate number for which the second occurrence has the minimal index. In other words, if there are more than 1 duplicated numbers, return the number for which the second occurrence has a smaller index than the second occurrence of the other number does. If there are no such elements, return -1.

Example

Input/Output

풀이

int solution(int[] a) {
    // int : count
    HashMap <Integer, Integer> map1 = new HashMap<>();
    // int : idx
    HashMap <Integer, Integer> map2 = new HashMap<>();
    
    for (int i = 0; i < a.length; i ++) {
        int n = a[i];
        // 숫자별 나온 횟수 갱신
        map1.put(n, map1.getOrDefault(n, 0) + 1);
        
        // 동일 숫자가 2회 나올 때 (첫 중복) 해당 인덱스 갱신
        if (map1.get(n) == 2) map2.put(n, i);
    }
    
    if (map2.size() < 1) return -1;
    
    int min = Integer.MAX_VALUE;
    int key = 0;
    
    for (int i : map2.keySet()) {
        if (map2.get(i) < min) {
            key = i;
            min = map2.get(i);
        }
    }
    
    return key;
}