본문 바로가기
개발/개발 공부

[프로그래머스] 코딩테스트 입문 : 최빈값 구하기

by 하모예 2024. 8. 28.

| 문제

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다.

정수 배열 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

| 풀이 1

본질에 집중하다 보니 정말 많이 복잡한 로직이 나왔습니다.

1000 미만의 값만 매개변수로 주어지는 배열의 값으로 사용된다고 해서

1000 크기를 가지는 배열을 구성했습니다.

그리고, 해당 배열의 인덱스를 마치 원소의 값처럼 사용했어요.

매개변수 배열 안에 있는 각 숫자값을 꺼내와서

1000짜리 배열에 개수를 반영해 주었습니다.

public int solution01(int[] array) {
    int answer = 0;
    int[] numArr = new int[1000];
    for(int i = 0 ; i < array.length ; i++){
        int n = array[i];
        numArr[n]++;
    }
    int max = 0;
    int maxNum = 0; 
    for(int i = 0 ; i < numArr.length ; i++){
        if(numArr[i] > max){
            max = numArr[i];
            maxNum = i;
        }
    }
    int n = 0; 
    for(int i = 0 ; i < numArr.length ; i++){
        if(numArr[i] == max){n++;}
    }
    if(n == 1){
        answer = maxNum;
    } else{
        answer = -1;
    }
    return answer;
}

| 풀이 2

풀이 1번보다는 단순화한 로직입니다.

위에서는 마치 배열의 인덱스를 key값으로 사용했다면

여기서는 key, value형식으로 데이터를 저장할 수 있는 Map을 사용했습니다.

매개변수 배열 원소의 값을 key로, 개수를 value로 지정했어요.

public int solution02(int[] array) {
    int answer = 0 ; 
    int maxCount = 0; 
    Map<Integer, Integer> map = new HashMap<Integer,Integer>();
    for(int i = 0 ; i < array.length ; i++) {
        int count = map.containsKey(array[i])?map.get(array[i])+1 : 1;
        if(count > maxCount) {
            maxCount = count;
            answer = array[i];
        } else if(count == maxCount) {
            answer = -1;
        }
        map.put(array[i],count);
    }
    return answer;
}

| 해설

자바의 컬렉션을 다양하게 활용해 볼 수 있는 좋은 문제입니다.

컬렉션에는 Map, List, Set 등이 있는데 여기서는 Map과 List를 사용했습니다.

Map은 다양한 자료형이 올 수 있는 key값을 기준으로 데이터를 구분하고,

List는 데이터를 구분하는 용도로 숫자 형태의 인덱스(번호)를 사용하지요.

 

최빈값 구하기 문제에서는 key값으로 사용되는 정보가 숫자이다 보니

List의 인덱스와 Map의 key 모두 적용할 수 있었고,

같은 로직을 List로도, Map으로도 구성할 수 있었습니다.

보통 최빈값을 구할 때는 데이터베이스에서 정렬한 다음 가장 상위 값만 가지고 오거나

데이터베이스의 max함수를 사용하다 보니 평소에 잘 쓰지 않는 로직이라서 더 재밌었던 것 같아요.

하나씩 풀어가는 맛이 아주 쏠쏠합니다!!

댓글