문제
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array 가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러개면 -1을 return 합니다.
제한사항
- 0 < array 의 길이 < 100
- 0 <= array의 원소 < 1000
입출력 예
array | result |
[1, 2, 3, 3, 3, 4] | 3 |
[1, 1, 2, 2] | -1 |
[1] | 1 |
코드(Java) - 내 코드
import java.util.Arrays;
class Solution {
public int solution(int[] array) {
int answer = 0;
Arrays.sort(array);
int max = array[array.length-1];
int count[] = new int[max+1];
for(int i=0; i<array.length; i++) {
count[array[i]]++;
}
int maxCount = count[0];
for(int i=1; i<count.length; i++) {
if(maxCount < count[i]) {
maxCount = count[i];
answer = i;
} else if(maxCount == count[i]) {
answer = -1;
}
}
return answer;
}
}
코드(Java) - 다른 사람 코드
import java.util.HashMap;
import java.util.Map;
class Solution {
public int solution(int[] array) {
int maxCount = 0;
int answer = 0;
Map<Integer, Integer> map = new HashMap<>();
for(int number : array){
int count = map.getOrDefault(number, 0) + 1;
if(count > maxCount){
maxCount = count;
answer = number;
} else if(count == maxCount){
answer = -1;
}
map.put(number, count);
}
return answer;
}
}
풀이 과정
문제를 보자마자 접근 방법이 떠올리는데에만 시간을 꽤 많이 쓴 것 같다. 이번에도 떠올린 해결방법은 결국 또 배열이었다.
1. 입력값의 인덱스를 1씩 증감시켜주기 위해 배열을 만들었다. (공간 낭비를 최소화하기 위해서 입력값의 최댓값만큼의 공간 할당)
ex) 입력값이 3이면 인덱스가 3인 값을 증감시켜야 하므로 배열 count[3] 을 증감(++) 시켜준다.
2. 배열을 처음부터 돌면서 maxCount 라는 변수에 max 값을 할당해주면서 최빈값의 개수를 확인한다.
코드가 정상적으로 실행된 후, 다른 사람의 코드를 찾아보니 HashMap 을 사용하여 코드를 짜는 방법이 있었다.
코드의 흐름 자체는 내가 작성한 코드와 비슷하지만, 내 코드는 불필요한 배열의 공간을 사용한다는 단점이 있기 때문에 확실히 HashMap 을 사용한 코드가 더 효율적이라는 것을 느낄 수 있었다.
이전에 다룬 "겹치는 선분의 길이" 알고리즘 풀이 게시물에서도 배열로 풀었을 때보다 HashMap 으로 풀었을 때가 더 효율적인 코드였다.
HashMap 을 사용하는 문제가 나왔을 때 바로 HashMap 이 떠오르도록 더 익숙해질 때까지 연습을 많이 해야겠다는 생각을 했다.
알게된 내용
(이전 게시물에서 다뤘지만 한번 더 적어두자면) HashMap 코드를 분석하다가 알게된 getOrDefault 의 의미에 대해 기록해두려고 한다.
getOrDefault 란, 찾는 키가 존재한다면 찾는 키의 값을 반환하고 키가 존재하지 않는다면 기본 값을 반환하는 메서드이다.
아래 코드는 위에 작성된 코드 활용한 사용방법이다.
for(int number : array) {
int count = map.getOrDefault(number, 0) + 1;
...
}
//number라는 Key에 매핑된 값이 없는 경우 디폴트값(0)을 count에 대입
//number라는 Key에 매핑된 값이 있는 경우 (매핑되어있는 값+1)을 count에 대입
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 분수의 덧셈 - Kotlin(코틀린) (0) | 2023.08.11 |
---|---|
[프로그래머스] 특이한 정렬 - Kotlin(코틀린) (0) | 2023.08.10 |
[프로그래머스] 안전지대 - Java(자바) (3) | 2023.08.04 |
[프로그래머스] 겹치는 선분의 길이 - Java(자바) (0) | 2023.08.02 |