Recent Posts
Recent Comments
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Today
Total
관리 메뉴

100세까지 코딩

[프로그래머스] Lv0.최빈값 구하기 본문

코딩테스트/자바

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

100세까지 코딩 2023. 8. 17. 21:40
문제 설명

 

풀기 전 생각
  • array의 원소를 새로운 배열(횟수 배열)의 index로 생각하여 나올 때마다 횟수 배열값에 +1해 주기
  • 최빈값은 횟수 배열의 인덱스 대입, 최대로 나온 횟수는 cntMax라는 변수에 횟수 배열 값 대입
  • 후에 나온 횟수 배열 값이 이전 cntMax와 값이 같으면 temp라는 곳에 최빈값 출현 횟수 대입
  • temp와 cntMax가 같으면 최빈값이 2개이므로 답은 -1, 그렇지 않으면 답은 횟수 배열 인덱스
class Solution {
    public int solution(int[] array) {
        int answer = 0;
        int[] cntArr = new int[1000]; // 나오는 횟수가 저장될 배열
        int max = 0;  // 최빈값을 저장할 변수
        int cntMax = 0;  // 최빈값 나온 횟수를 저장할 변수
        int temp = 0;  // 최빈값 나온 횟수 같은때, 최빈값을 횟수를 저장할 변수

        for(int i = 0; i < array.length; i++){
            cntArr[array[i]]++;   // array 배열안에 숫자를 cntArr의 인덱스로 생각해서 값+1 해준다.
        }
        for(int i = 0; i < cntArr.length; i++){
            if(cntArr[i]>cntMax){ // 횟수 배열안에 값이 cntMax보다 크면
                max = i;  // 최빈값은 횟수 배열의 INDEX
                cntMax = cntArr[i];  // cntMax는 횟수 배열의 값
            }else if(cntArr[i]==cntMax){ // 횟수 배열의 값과 이전 최빈값 출현 횟수가 같으면
                temp = cntMax; // temp에 최빈값 출현 횟수 저장
            }
        }
        if(cntMax == temp){  // 현재 최빈값 출현 횟수와 이전 temp에 저장된 출현 횟수가 같으면
            answer = -1;  // 최빈값이 여러개이므로 -1
        }else{  
            answer = max; // 아니면 최빈값이 답
        }
        return answer;
    }
}
오류 및 개선
  • 오류는 없었지만 개선 사항 필요
  • 2번째 반복문에서 if - else if기 때문에 temp가 굳이 필요 없이 cntArr [i]==cntMax이면 answer = -1로 하면 된다
  • 또한, max 변수도 필요 없이 바로 answer = i로 하면 가독성이 증가
최종
class Solution {
    public int solution(int[] array) {
        int answer = 0;
        int[] cntArr = new int[1000]; // 나오는 횟수가 저장될 배열
        int cntMax = 0;  // 최빈값 나온 횟수를 저장할 변수

        for(int i = 0; i < array.length; i++){
            cntArr[array[i]]++;   // array 배열안에 숫자를 cntArr의 인덱스로 생각해서 값+1 해준다.
        }
        for(int i = 0; i < cntArr.length; i++){
            if(cntArr[i]>cntMax){ // 횟수 배열안에 값이 cntMax보다 크면
                answer = i; // i가 최빈값
                cntMax = cntArr[i];  // cntMax는 i일때 횟수 배열의 값
            }else if(cntArr[i]==cntMax){ // 횟수 배열의 값과 이전 최빈값 출현 횟수가 같으면
                answer = -1; // 최빈값이 2개 이상이므로 -1
            }
        }
        return answer;
    }
}