FireDrago

lv0 - 최빈값 구하기 (자바) 본문

코딩테스트/프로그래머스

lv0 - 최빈값 구하기 (자바)

화이용 2023. 6. 5. 11:30

문제설명

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수배열 array 가 매개변수로 주어질때,

최빈값을 return 하도록 Solution 함수를 완성해보세요. 최빈값이 여러개면 -1을 return 합니다.

입출력 예

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

생각정리

1. 배열의 값을 세는 count 배열을 만들어서 array의 값이 index가 되도록 배열을 초기화 하자

int answer = 0;
Arrays.sort(array) // 최댓값이 배열 맨 뒤로 오게 하기 위해 정렬
int [] count = new int [array[array.length-1]+1];
// count 배열의 갯수는 array 배열의 최대값 +1 (0 포함하기 때문에 1증가)


for (int i=0; i<array.length; i++) {
    count[array[i]]++;
    // array의 값이 등장 할때마다 해당 index가 1씩 증가한다.

 

2. 이제 count 배열에서 가장 큰 값의 index를 구해야 한다. (빈출값)

외부에서 max 값을 정의하고 max 값이 바뀔때 마다 최빈값을 찾아 저장한다. (for 문 안의 if문 사용)

int answer = 0;
Arrays.sort(array);
int [] count = new int [array[array.length-1]+1];
int max = 0;

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

    if (max < count[array[i]]) {
        max = count[array[i]];
        answer = array[i];
    }
}

 

3. 마지막으로 최빈값이 반복되면 -1 을 return 해야 한다.

반복문을 통해 max 값과 일치하는 값이 두번이상 등장하면 -1 을 리턴하도록 함수를 정의한다.

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

 

import java.util.*;
class Solution {
    public int solution(int[] array) {
        int answer = 0;
        Arrays.sort(array);
        int [] count = new int [array[array.length-1]+1];
        int max = 0;
        
        for (int i=0; i<array.length; i++) {
            count[array[i]]++;
        
            if (max < count[array[i]]) {
                max = count[array[i]];
                answer = array[i];
            }
        }
        int repeat = 0;
        for (int i=0; i<count.length; i++) {
            if (max == count[i]) {
                repeat++;
            }
        }
        if (repeat >1) {answer = -1;}
        return answer;
    }
}

최종 코드를 완성했다. 잘 돌아가는데 Stream 써서 해결하는 답안도 있었다. stream 잘 쓰고 싶다.