티스토리 뷰

-문제설명

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.

 

-제한사항

-0 < array의 길이 < 100

-0 ≤ array의 원소 < 1000

 

입출력 예시

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

 

쉬운 문제였는데, 처음에 생각없이 풀다가 굉장히 시간낭비를 했다.

(그렇다고 정답 코드가 최고의 답안은 아니지만..ㅠ)

 

처음엔 아래처럼 코드를 짰다.

 

class Solution {
    public int solution(int[] array) {
        int[] mode = new int[array.length + 1];

        int modeNum = 0; //최빈수
        int modeCnt = 0; //최빈수가 나온 횟수
        int repeatCnt = 0;

        if(array.length == 1){
            modeNum = array[0];
        }else{
            //index는 최빈값
            //index의 value는 최빈값의 횟수
            for (int i = 0; i < array.length; i++){
                mode[array[i]]++;
            }

            for (int i = 0; i < array.length; i++) {
                if (modeCnt < mode[i]) {
                    modeCnt = mode[i];
                    modeNum = i;
                }
            }

            for (int i = 0; i < array.length; i++){
                if (modeCnt == mode[i]){
                    repeatCnt++;
                }
                if (repeatCnt == 2){
                    modeNum = -1;
                }
            }
        }

        return modeNum;
    }
}

얼핏보면 될 것 같기도 한데, 중복되는 modeCnt 값을 확인하는 것도 이상하고

무엇보다도 최빈값이 들어가는 배열의 크기를 잘못 설정했다.

예를 들면 배열이 {1, 7, 7} 이런 식으로 주어졌을 때, 런타임 오류가 발생하게 되는 것이었다.

 

 

 


class Solution {
    public int solution(int[] array) {
        int arrayMaxValue = 0;

        for (int i = 0; i < array.length; i++){
            if (array[i] > arrayMaxValue){
                arrayMaxValue = array[i];
            }
        }

        //최대값 포함을 위해 +1
        int[] countingList = new int[arrayMaxValue + 1];

        int modeCnt = 0;
        int modeNum = 0;
        int repeatCnt = 0;



        //배열의 원소가 몇 번씩 나오는지를 확인하는 배열 생성
        for (int i = 0; i < array.length; i++){
            countingList[array[i]]++;
        }

        for (int i = 0; i < countingList.length; i++){
            if (modeCnt < countingList[i]){
                modeCnt = countingList[i];
                modeNum = i;
            }
        }

        for (int i = 0; i < countingList.length; i++){
            if (countingList[i] == modeCnt){
                repeatCnt++;
            }
        }

        if (repeatCnt > 1){
            modeNum = -1;
        }

        return modeNum;
    }
}

그래서 생각한 것은 주어진 배열에서 가장 큰 원소를 찾고, 그 원소를 기준으로 해서 배열의 크기를 잡으면 되겠다고 생각했다.

 

repeatCnt는 이전 방법과 비슷하지만 값이 1보다 크면 -1을 리턴하도록 했다.

최빈값이 1개이면 repeatCnt 도 1이니까!

댓글