(java)프로그래머스 코딩테스트 - 최빈값 구하기

navelop·2023년 10월 14일
0

TIL(CODE)

목록 보기
12/20

📣 이것저것 시도해보다 실패해서
다른분들의 풀이를 두개정도 참고해 정리해보았다.

Q. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
제한사항
0 < array의 길이 < 100
0 ≤ array의 원소 < 1000

1.

class Solution {
    public int solution(int[] array) {
        int[] count = new int[1000]; // 배열의 값 0~999

        int maxCount = 0; // 가장 높은 빈도수 저장(최빈값)
        int answer = -1; // 초기값 -1 (최빈값이 있는 경우 default)

		// 배열 요소를 순회하며 빈도수를 카운트한다
        // 배열의 각 원소를 num 변수에 하나씩 대입하는 루프
        for (int num : array) {
            count[num]++;
        }
        // ex) [1,2,3,2,1]
        // count[1] = 2; (1이 두번 나옴) -- count 배열을 통한 빈도수 카운트

		// 최빈값 구하기
        // 즉 가장 높은 빈도수를 가진 값을 찾고, 이 값을 answer에 저장
        for (int i = 0; i < count.length; i++) {
            if (count[i] > maxCount) {
                maxCount = count[i]; // 현재 가장 높은 빈도수 i
                answer = i;
            }
        }

		// 중복값 확인 = 여러 값이 동일한 최빈수를 가질 수 있으므로
        // (문제에 제시된 사항임) ex [1,2,2,3,3]
        for (int i = 0; i < count.length; i++) {
            if (count[i] == maxCount && i != answer) {
                // 중복된 최빈값이 존재하면 -1을 반환
                return -1;
            }
        }

        return answer;
    }
}

2. HashMap 사용

import java.util.*;
class Solution {
    public int solution(int[] array) {
    
        int maxCount = 0;
        int answer = 0;
		
        // 빈도수를 저장할 map 생성
        Map<Integer, Integer> map = new HashMap<>();

        for(int number : array) {
        // map에 현재 값 number에 대한 빈도수를 가져와서 1을 더한 값을 count에 저장
            int count = map.getOrDefault(number, 0) + 1;

            if(count > maxCount) {
            // a.현재 값의 빈도수가 최대 빈도수보다 크면, 최대 빈도수와 최빈값 갱신
                maxCount = count;
                answer = number;
            }

            else if(count == maxCount) {
            // b.현재 값의 빈도수가 최대 빈도수와 같으면 -1로 갱신
                answer = -1;
            }
			// 현재 값을 빈도수와 함께 저장
            map.put(number, count);
        }

        return answer;
    }
}

🖇️getOrDefault
Java 8에서 추가된 Collection API 함수 JAVA 'map' 인터페이스의 일부
주어진 key에 대한 값을 반환하고 해당 키가 맵에 존재하지 않으면 기본 값을 반환한다.
getOrDefault((Object) key, V (DefaultValue))

Map<String, Integer> map = new HashMap<>();
map.put("apple",3);
map.put("banana",2);

int count1 = map.getOrDefault("apple", 0); 
int count2 = map.getOrDefault("cherry", 0); 

// count 1 == 3 출력
// count 2 == cherry는 map에 존재하지 않으므로 기본값 0 출력

🖇️int count 에서 +1을 한 이유

빈도수를 계산하기 위함. count 변수는 현재까지 해당 숫자의 개수를 나타내고,
+1을 더하여 업데이트 시키는 것

ex) [1, 2, 2, 3, 1]
이 배열을 순회하면서 각 숫자의 빈도수를 계산하려면

1. 1을 만났을 때, 1의 빈도수 = 1
2. 2를 만났을 때, 2의 빈도수 = 1
3. 다시 2를 만났을 때, 2의 빈도수 = 2 (+1)

0개의 댓글