각종 문제들

[프로그래머스] 코딩테스트 입문 - 최빈값 구하기

hunm719 2023. 3. 30. 10:11

문제 출처 : 프로그래머스


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
32
import java.util.Arrays;
 
class Solution {
    public int solution(int[] array) {
        Arrays.sort(array);
        
        int answer = 0;
        int max = 0;
        int maxNum = array[0];
        int count = 1;
 
        for (int i = 1; i < array.length; i++) {
            if (array[i] == array[i-1]) {
                count++;
                if(count > max) {
                    max = count;
                    maxNum = array[i];
                }
                else if (count == max) {
                    maxNum = -1;
                }
            }
            else {
                count = 1;
            }
        }
        
        answer = maxNum;
        
        return answer;
    }
}
cs

위의 코드는 내가 풀어낸 방식이다.

솔직히... 당연히 통과할 줄 알았다.

그런데

실패한 테스트 케이스가 있었다...!!

 

 

아무리 찾아봐도 어떤 테스트 케이스에서 실패하는 건지를 찾을 수가 없어서 구글링을 통해 해당 문제를 통과한 사람의 코드를 가져와 내 코드와 비교해볼 생각이다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
    public int solution(int[] array) {
        int answer = array[0];
        int max = 0int frequent[] = new int[1000];
        
        for(int i = 0; i < array.length; i++) {
            frequent[array[i]]++;
            
            if(max < frequent[array[i]]) {
                max = frequent[array[i]];
                answer = array[i];
            }
        }
        
        int temp = 0// 여러 개인 지
        for(int j = 0; j < 1000; j++) {
            if(max == frequent[j]) temp++;
            if(temp > 1) answer = -1;
        }
        
        return answer;
    }
}
cs

 

http://happy_posting.log

위의 코드는 모든 테스트 케이스를 통과한 코드로, 이를 자세히 분석해보자.

 

class Solution {
    public int solution(int[] array) {
        int answer = array[0];
        // array의 첫 번째 요소로 초기화된 answer 선언
        int max = 0; int frequent[] = new int[1000];
        // 0으로 초기화된 max 변수와 크기가 1000인 정수형 배열 frequent를 선언
        
        for(int i = 0; i < array.length; i++) {
            frequent[array[i]]++;	// requent 배열의 해당 요소 값을 증가
            
            if(max < frequent[array[i]]) {	// frequent값이 max보다 크면
                max = frequent[array[i]];	// max값을 갱신하고
                answer = array[i];		// answer값을 배열 array의 현재 요소 값으로 갱신
            }
        }
        
        int temp = 0;
        for(int j = 0; j < 1000; j++) {		
            if(max == frequent[j]) temp++;	// max값과 같은 요소의 개수를 계산
            if(temp > 1) answer = -1;		// 개수가 1보다 크면 answer값을 -1로 갱신
        }
        
        return answer;
    }
}

열심히 찾아보고 있지만... 어떤 케이스였길래 내 코드에선 실패하고 위에선 성공했는지 감이 안 잡힌다..ㅠㅠ

혹시나 찾으신 분이 있다면 댓글로 알려주시면 정말 감사합니다 :)