본문 바로가기
프로그래머스/Lv.0

프로그래머스 > 코딩테스트 입문 > 최빈값 구하기 - JAVA

by 아찌방 2022. 12. 17.

문제

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

 

제한사항

  • 0 < array의 길이 < 100
  • 0 ≤ array의 원소 < 1000

 

입출력 예

array result
[1, 2, 3, 3, 3, 4] 3
[1, 1, 2, 2] -1
[1] 1

 

코드

 

import java.util.*;

class Solution {
    public int solution(int[] array) {
        int answer = 0;
        
        Arrays.sort(array); // 체크할 배열의 크기를 알기 위해
        int size = array[array.length-1]+1; // 마지막 값(가장 큰 값) + 1의 크기로 배열생성
        int[] check = new int[size]; // 빈도 수 세기
        int max = 0; // 가장 많은 빈도 수 체크
        int count = 0; // 가장 많은 빈도 수가 두개 이상인지 체크
        
        for(int i = 0; i < array.length; i++)
        {
            check[array[i]]++;
        }
        
        for(int i = 0; i < size; i++)
        {
            if(check[i] >= max)
            {
                max = check[i];
                answer = i;
            }
        }
        
        for(int i = 0; i < size; i++)
        {
            if(check[i] == max)
            {
                count++;
                if(count > 1)
                {
                    answer = -1;
                    break;
                }
            }
        }
        return answer;
    }
}

 

풀이

 

최빈값이란

나온 횟수가 가장 많은 값을 말한다.

 

check 배열을 만드는 이유

이 배열의 주소를 array 의 값이라고 생각하고 

주소에 그 값이 나올때마다 1을 더해준다.

sort()한 이유는

check 배열의 사이즈를 알기 위해서이다.

array 배열에 포함 되어 있는 숫자가 check 배열의 주소값과 맞추기 위해서

array 배열 내에 가장 큰 값을 알아내기 위해서다.

 

int size = array[array.length-1]+1; 

여기서 +1을 한 이유는

조건에서 원소값이 0부터 시작할 수 있다는 것과

값과 주소를 일치하기 위해서다.

(이렇게 하지 않을 경우 배열은 0부터 시작하기 때문에 일치하지 않는다.)

 

그런 준비가 끝나면 빈도 수를 check 배열에 저장하면서

최대 빈도수(max)를 찾는다.

 

그 후 최대 빈도수(max)와 같은게 몇개 인지 센다.(count)

그 수(count)가 1이면 answer에 최대 빈도값을 출력, 

그 수가 2 이상이면 -1을 출력한다.

 

다음에 또 봐요

 

728x90