Algorithms/프로그래머스

[프로그래머스] '최빈값 구하기' - Java

LEFT 2023. 2. 24. 12:14

<문제 제시>

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

<예시 입출력>


<문제 해결 과정>


Try 1) 테스트케이스는 통과했지만 런타임 에러가 발생하여 전체 케이스를 통과하진 못하였다.

<오류코드>

public static int solution(int[] array) {
    int answer = 0;
    int length = array.length;
    int[] index = new int[length + 1];
    int temp = 0;

    int max = Integer.MIN_VALUE;

    for(int i = 0; i < length; i++) {
        index[array[i]]++;
    }

    for(int i = 0; i < index.length; i++) {
         if(index[i] > max) {
             max = index[i];
             answer = i;
         }
    }

    for(int i = 0; i < index.length; i++) {
        if(index[i] == max) temp++;
    }

    if(temp > 1) answer = -1;

    return answer;
}



Solution 1) 기존 array 배열과 인덱스값을 +1늘린 index 배열을 for문으로 검색해보기로 하였다.

>> 인덱스 값을 +1늘린 이유는 마지막 값에서 검색할때 인덱스 범위 오류가 발생하는 것을 방지하기 위해서이다.

<개선코드>

배열을 검색하며, 배열의 가장 큰 값을 구한다. (arr_max)

int answer = 0;
int arr_max = 0;

for (int i = 0; i < array.length; i++) {
    if (array[i] > arr_max) {
        arr_max = array[i];
    }
}

 

아까 구한 가장 큰 값에서 +1늘린 크기로 정수형 배열을 만든다.

count[array[i]]++; 코드로 배열에서 array[i] 값과 일치하는 부분을 증가시킨다. (발생한 횟수를 카운트)

int[] count = new int[arr_max + 1];
int max = 0;

int n = 0;
int mode = 0;

for (int i = 0; i < array.length; i++) {
    count[array[i]]++;
}

 

그 후 if( count[i] > max) 코드를 통해 가장 많이 count된 인덱스를 구한다.

최빈값이 여러개일 경우에는 if( n > 1) answer = -1; 을 반환한다.

for (int i = 0; i < count.length; i++) {
    if (count[i] > max) {
        max = count[i];
        answer = i;
    }
}

for (int i = 0; i < count.length; i++) {
    mode++;

    if (count[i] == max) {
        n++;
    }
}

if (n > 1) answer = -1;

return answer;

이 코드 또한 조금 더 간단하게 나타낼 수 있을 것 같다.


<전체코드>

import java.util.Arrays;

public class mode_value {
	
	public static int solution(int[] array) {
        Arrays.sort(array);

        int answer = 0;
        int max = 0;
        int maxNum = array[0];
        int cnt = 1;

        for (int i = 1; i < array.length; i++) {
            if(array[i] == array[i-1]) {
                cnt++;
                if(cnt > max) {
                    max = cnt;
                    maxNum = array[i];
                }
                else if(cnt == max) {
                    maxNum = -1;
                }
            }
            else{
                cnt = 1;
            }
        }
        
        answer = maxNum;
        
        return answer;
    }
	
	public static void main(String[] args) {
		int[] array = {1,1,2,2};
		
		System.out.println(solution(array));
	}
}

먼저 배열을 Arrays.sort(array)를 통해 오름차순 정렬하고, 배열의 첫번째 인덱스 값을 maxNum으로 초기설정해준 후 

cnt를 동시에 증가시키며 최대값을 찾는다. 

cnt값을 통해 최빈값도 찾게되는 문제이다.


문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120812

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr