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

[프로그래머스] 최빈값 구하기 - Java(자바)

sinw212 2023. 8. 3. 21:19

문제

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 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

 


코드(Java) - 내 코드

import java.util.Arrays;

class Solution {
    public int solution(int[] array) {
        int answer = 0;
        Arrays.sort(array);
        int max = array[array.length-1];
        int count[] = new int[max+1];
        for(int i=0; i<array.length; i++) {
            count[array[i]]++;
        }
        
        int maxCount = count[0];
        for(int i=1; i<count.length; i++) {
            if(maxCount < count[i]) {
                maxCount = count[i];
                answer = i;
            } else if(maxCount == count[i]) {
                answer = -1;
            }
        }
        return answer;
    }
}

코드(Java) - 다른 사람 코드

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int solution(int[] array) {
        int maxCount = 0;
        int answer = 0;
        Map<Integer, Integer> map = new HashMap<>();
        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;
    }
}

풀이 과정

문제를 보자마자 접근 방법이 떠올리는데에만 시간을 꽤 많이 쓴 것 같다. 이번에도 떠올린 해결방법은 결국 또 배열이었다.

 

1. 입력값의 인덱스를 1씩 증감시켜주기 위해 배열을 만들었다. (공간 낭비를 최소화하기 위해서 입력값의 최댓값만큼의 공간 할당)

   ex) 입력값이 3이면 인덱스가 3인 값을 증감시켜야 하므로 배열 count[3] 을 증감(++) 시켜준다.

2. 배열을 처음부터 돌면서 maxCount 라는 변수에 max 값을 할당해주면서 최빈값의 개수를 확인한다.

 

코드가 정상적으로 실행된 후, 다른 사람의 코드를 찾아보니 HashMap 을 사용하여 코드를 짜는 방법이 있었다.

코드의 흐름 자체는 내가 작성한 코드와 비슷하지만, 내 코드는 불필요한 배열의 공간을 사용한다는 단점이 있기 때문에 확실히 HashMap 을 사용한 코드가 더 효율적이라는 것을 느낄 수 있었다.

 

이전에 다룬 "겹치는 선분의 길이" 알고리즘 풀이 게시물에서도 배열로 풀었을 때보다 HashMap 으로 풀었을 때가 더 효율적인 코드였다.

HashMap 을 사용하는 문제가 나왔을 때 바로 HashMap 이 떠오르도록 더 익숙해질 때까지 연습을 많이 해야겠다는 생각을 했다.

 


알게된 내용

(이전 게시물에서 다뤘지만 한번 더 적어두자면) HashMap 코드를 분석하다가 알게된 getOrDefault 의 의미에 대해 기록해두려고 한다.

getOrDefault 란, 찾는 키가 존재한다면 찾는 키의 값을 반환하고 키가 존재하지 않는다면 기본 값을 반환하는 메서드이다.

 

아래 코드는 위에 작성된 코드 활용한 사용방법이다.

for(int number : array) {
    int count = map.getOrDefault(number, 0) + 1;
    ...
}
//number라는 Key에 매핑된 값이 없는 경우 디폴트값(0)을 count에 대입
//number라는 Key에 매핑된 값이 있는 경우 (매핑되어있는 값+1)을 count에 대입