프로그래머스/JAVA

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

달의요정루나 2023. 7. 4. 22:02

https://school.programmers.co.kr/learn/courses/30/lessons/120812

 

프로그래머스

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

programmers.co.kr

1. 답안1(오답)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
class Solution {
    public int solution(int[] array) {
        int answer = 0;

      ArrayList<Integer> arrayList = new ArrayList<Integer>();

      for(int data:array) {//array에 입력된 값들을 중복없이 arrayList에 넣는다.
         if(!arrayList.contains(data)) {
            arrayList.add(data);
         }
      }

      int[]count=new int[arrayList.size()];//array에 있는 값들의 중복객수를 구하기 위한 count배열이다.

      for (int i = 0; i < arrayList.size(); i++) {
          //arrayList에 있는 값들을 이용해 array에 있는 값과 하나하나 씩 비교한다.
         for (int j = 0; j < array.length; j++) {      
            if (arrayList.get(i)==array[j]) {
               count[i]=count[i]+1;//중복되는 수 마다 한개씩 카운트해준다.
            }
         }
      }

      int max=0;

      Integer[] as = new Integer[count.length];

      for (int i = 0; i < count.length; i++) {
         max=Math.max(max, count[i]);
         as[i]=count[i];
      }//count 배열에서 가장 큰값이 무엇인지 알아내고 Collections 사용을 위해 as배열에 count배열 값을 넣는다.
      int index=Arrays.binarySearch(count, max);//count에서 가장 큰값의 인덱스를 구한다.
      int index_count=Collections.frequency(Arrays.asList(as), max);//최빈값 개수가 겹쳐지는지 확인한다.
      if (index_count>=2) {//최빈값이 2개일 경우 -1을 리턴한다.
          answer= -1;
      }else {//최빈값이 하나일경우 count에 있는 인덱스 값을 arrayList에 넣어 최빈값을 출력한다.
          //count의 인덱스를 arrayList 인덱스는 같기 때문에 count의 인덱스 값을 arrayList에 입력해서 나온수가 최빈값이다.
          answer= arrayList.get(index);
      }
        return answer;
    }
}

- 값은 정확하게 다 나왔지만 테스트 케이스에서 런타임에러 여러개가 나왔다.

- 이유는 'int index=Arrays.binarySearch(count, max);'가 문제였다. binarySearch메소드는 정렬된 배열에서 동작하는 알고리즘이다. 정렬되지 않은 배열때문에 일어난 오류였다.

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

- 그래서 해당 부분을 for문방식으로 고쳐야 했다.

 

2. 답안2(정답)

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
class Solution {
    public int solution(int[] array) {
        int answer = 0;
        Map<Integer, Integer>map=new HashMap<Integer, Integer>();
		for (int i : array) {
			map.put(i,map.getOrDefault(i, 0)+1);
		}//HashMap을 통해 키와 값 형식으로 값을 입력받았다.
        //키에는 array배열에 있는 중복없는 숫자들,
        //value에는 getOrDefault를 통해 해당 숫자의 개수가 들어간다.

		Integer max = Collections.max(map.values());
        //max는 map의 value중 최대값을 찾는다.

		int cnt=0;
		int key=0;
		for (Entry<Integer, Integer> i : map.entrySet()) {
			if(i.getValue()==max) {
				cnt++;
				key=i.getKey();
			}
			
		}//최대 value값을 가진 map의 key값을 찾아낸다.
        //그리고 최대 value값이 몇개가 있는지 cnt를 통해 파악한다.
		
		if(cnt>1) {//최대 value값이 여러개라면 -1을 리턴하고 아니면 해당 key의값을 리턴한다.
			answer=-1;
		}else {
			answer=key;
		}
        return answer;
    }
}

- map을 통해 key, value를 통해서 푼 결과 코드가 더 간단해졌고 쉽게 구할 수 있었다.