programmers

[JAVA] ★ 최빈값 구하기 HashMap

아잠만_ 2024. 3. 9. 23:43
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.

풀이1) Arrays.sort()를 활용한 풀이

import java.util.Arrays;

class Solution {
	public int solution(int[] array) {
		int answer = array[0];
		// 빈도값을 순서대로 저장하기 위해 배열 정렬
		Arrays.sort(array);
		int fr[] = new int[array.length];
		int max[] = new int[array.length];
		int j = 0;

		// fr[] : 빈도값을 저장하는 배열
		// max[] : 빈도값에 대응하는 숫자를 저장하는 배열
		for (int i = 0; i < array.length - 1; i++) {
			if (array[i] == array[i + 1]) {
				fr[j]++;
				max[j] = array[i];
			} else {
				j++;
			}
		}

		int a = 0;
		// 제일 높은 빈도값 fr[a]를 찾아 max[a]를 answer값에 대입
		for (int i = 0; i < array.length; i++) {
			if (fr[a] <= fr[i]) {
				a = i;
				answer = max[a];
			}
		}

		// 만약 배열이 1개일 경우
		if (array.length == 1) {
			answer = array[0];
		// 최빈값이 여러개일 경우
		} else {
			Arrays.sort(fr);
			if (fr[array.length - 1] == fr[array.length - 2]) {
				answer = -1;
			}
		}
		return answer;
	}
}

풀이2) HashMap을 활용한 풀이

import java.util.*;
class Solution {
    public int solution(int[] array) {
        int maxCount = 0;
        int answer = 0;
        Map<Integer, Integer> map = new HashMap<>();
        //확장 for문
        for(int number : array){
            int count = map.getOrDefault(number, 0) + 1;
            if(count > maxCount){
                maxCount = count;
                answer = number;
            }
            else  if(count == maxCount){
                answer = -1;
            }
            map.put(number, count);
        }
        return answer;
    }
}

HashMap

데이터를 저장할 때 키(key)와 값(value)가 짝을 이루어 저장

(빈도값과 숫자값을 저장해야되기 때문에 HashMap을 사용)

키 값은 중복될 수 없고 값은 키 값이 다르다면 중복이 가능하다.

java.util.HashMap 클래스를 import

HashMap<key변수, value변수> name = new HashMap< [ 변수, 변수] >( [ capacity, load factor ] );
Map<변수, 변수> name = new HashMap< >();

put 메소드 (get, remove 등등 다양한 메소드가 있음)

hashmap 데이터 넣기

name.put ( value , value )

확장 for문 (JDK 1.5이상)

for(타입 변수명 : 배열 또는 컬렉션) {
//배열 또는 컬렉션에 저장된 값이 매 반복마다 하나씩 순서대로 읽혀져 변수에 저장된다.
}

getOrDefault()

getOrDefault(Object Key, default value);