2 minute read

최빈값 구하기

문제 설명

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

  • [1, 2, 3, 3, 3, 4]에서 1은 1개 2는 1개 3은 3개 4는 1개로 최빈값은 3입니다.

입출력 예 #2

  • [1, 1, 2, 2]에서 1은 2개 2는 2개로 최빈값이 1, 2입니다. 최빈값이 여러 개이므로 -1을 return 합니다.

입출력 예 #3

  • [1]에는 1만 있으므로 최빈값은 1입니다.

나의 풀이 코드

//import java.util.Arrays;
import java.util.*;

class Solution {
    public int solution(int[] array) {
        int answer = 0;
        
        // 올림차순 정렬하기
        Arrays.sort(array);
        
        int current_count = 0;  //현재 빈도
        int largest_count = 0;  //가장 큰 빈도
        int mode = 0;   //최빈값
        int same_count_cnt = 0; //현재 빈도와 가장 큰 빈도가 같은 횟수
        
        if (array.length == 1){ //array의 요소가 하나밖에 없을경우 
            return array[0];    //최빈값은 그 요소이다.
        }   

        for (int i=0; i<array.length-1; i++){
            if (array[i] == array[i+1]){    //이번 요소와 다음 요소가 같을때
                current_count++;    // 현재 빈도 증가
            }
            else if (array[i] != array[i+1] ){  //이번 요소와 다음 요소가 다를때
                if (current_count > largest_count){ //현재 빈도가 가장 큰 빈도보다 클때
                    largest_count = current_count;  //현재 빈도가 가장 큰 빈도가 된다.
                    mode = array[i];    //최빈값은 현재 요소이다.
                    same_count_cnt = 0; //현재 빈도와 가장 큰 빈도가 같은 횟수는 0으로 초기화
                }
                else if (current_count == largest_count){   //현재 빈도와 가장 큰 빈도가 같을때
                    same_count_cnt++;   //현재 빈도와 가장 큰 빈도가 같은 횟수가 증가한다.
                }
                current_count = 0;  //현재 빈도는 0으로 초기화
            }
        }
        answer = mode;
        
        if (same_count_cnt >= 1){
            return -1;
        }
        
        return answer;
    }
}

위 코드에서 array모든 값을 못받는 문제에서 어려움을 겪었다. arraylist로 바꾸기도 하고 마지막 값을 null로 넣어보려는 방법도 해보았으나 모두 실패하였고 시간이 너무 지체되어 다른 사람이 푼 코드를 보았다.

배운점

import java.util.*;
class Solution {
    public int solution(int[] array) {
        int maxCount = 0; //가장 많이 등장하는 숫자의 등장 횟수를 저장하는 변수
        int answer = 0;
        Map<Integer, Integer> map = new HashMap<>(); //키와 등장 횟수를 값으로 저장하는 map이라는 해시맵 생성, 각 숫자의 등장 횟수를 추적
        for(int number : array){
            int count = map.getOrDefault(number, 0) + 1; //현재 숫자 number의 등장 횟수를 map에서 가져온다. 
            //만약 number가 map에 없으면 기본값으로 0을 사용. 이후 등장 횟수에 1을 더해서 count 변수에 저장
            if(count > maxCount){ //현재 숫자의 등장 횟수 count가 지금까지의 최대 등장 횟수 maxCount보다 크다면
                maxCount = count;
                answer = number;
            }
            else  if(count == maxCount){ //만약 현재 숫자의 등장 횟수 count가 최대 등장 횟수 maxCount와 같다면
                answer = -1;
            }
            map.put(number, count); //현재 숫자와 그 등장 횟수를 map에 저장
        }
        return answer;
    }
}

위 코드에서는 hash map을 사용한다.

hash map 정리
순서x, 중복(키x, 값o)
해싱기법으로 데이터 저장(검색속도가 빠르다!)(ex>환자정보 관리)

getOrDefault(Object key, V DefaultValue)메서드는 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메서드이다.
여기서 defaultValue는 지정된 키로 매핑된 값이 없는 경우 반환되어야 하는 기본값이다.


예외처리는 알고리즘 문제를 풀때는 필요할때만 하도록 한다. 코드가 길어져서 시간이 지체된다.

Leave a comment