문제
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
생각한 풀이
1. 파라미터로 받은 배열안에 나오는 수를 각각 카운트하자
2. 새로운 배열을 만들어 첫번째 배열에 나오는 수를 인덱스 번호로 카운트
3. 동일한 빈도 값이 나오거나, 빈도 값이 모두 1일때의 처리 중요
class Solution {
public int solution(int[] array) {
int[] count = new int[1001];
for (int num : array) {
count[num]++;
}
int max = 0;
int num = -1;
boolean mul = false;
for (int i = 0; i <= 1000; i++) {
if (count[i] > max) {
max = count[i];
num = i;
mul = false;
} else if (count[i] == max && count[i] > 0) {
mul = true;
}
}
return mul ? -1 : num;
}
}
🐴 풀이
1. 향상된 for문을 통해 array에 있는 값들에 해당하는 인덱스를 증가시켜주고 최빈값들을 확인하기 위해 아래의 for문을 돈다.
2. 아래 for문은 count[i]를 통해 해당 값이 얼마나 나왔는지 알수있다.
3. max보다 큰 빈도수를 같는 i가 있다면 max에 담아두고 해당 수를 num에 저장한다.
4. 만약 max와 값이 같고 빈도수가 0보다 크다면 기존 max와 같은 빈도수를 같는 수가 있다는것으로 중복이 발생해 mul를 true 변경한다.
도전한 풀이
1. 새로운 배열을 따로 만들지 않고 array에서 다음값과 바로 비교해 답을 구하는 방법
2. sort를 통해 처음값부터 array.length-1 까지 비교해 cnt++
import java.util.Arrays;
class Solution {
public int solution(int[] array) {
int answer = 0;
Arrays.sort(array);
int max = 0;
int cnt = 1;
boolean mul = false;
int num = array[0];
for (int i = 0; i < array.length - 1; i++) {
if (array[i] == array[i + 1]) {
cnt++;
} else {
if (cnt > max) {
max = cnt;
num = array[i];
mul = false;
} else if (cnt == max) {
mul = true;
}
cnt = 1;
}
}
if (cnt > max) {
num = array[array.length - 1];
} else if (cnt == max) {
mul = true;
}
answer = mul ? -1 : num;
return answer;
}
}
처음에 이 방식으로 했는데 테스트케이스 하나에서 오류가 발생해 30분 넘게 못풀어서 새로운 풀이로 도전. 중복 처리랑 마지막 인덱스까지 신경쓴거 같은데 왜 안돌아가는지 잘 모르겠다