문제
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
입출력 예
array | return |
[1, 2, 3, 3, 4] | 3 |
[1, 1, 2, 2] | -1 |
[1] | 1 |
이번 문제는 푸는데 시간이 꽤 걸렸습니다.
최빈값이라는게 제가 눈으로 보기엔 잘 보여도 코드로 구현하려니 어렵더라고요.
중요한 포인트를 세가지로 잡았습니다.
1. 정렬시키기
2. 원소가 1개인 경우 구분해두기
3. 중복 빈도수 구하고 저장시켜두기
4. 최빈값이 존재하는 경우와 존재하지 않는 경우 구분해두기
1. 정렬시키기
다음 원소와 동일한지 구분하려면 정렬을 꼭 시켜야 합니다.
2. 원소가 1개인 경우 구분해두기
이 경우는 해당 원소를 값으로 출력해줘야하기 때문에 (ex. [7] -> return '7')
따로 위에 경우를 빼두었습니다.
3. 중복 빈도수 구하고 저장시켜두기
이 부분이 가장 헷갈렸는데요. 차근차근 설명해보겠습니다.
count = 중복 값을 세기 위한 변수
max = 몇번이나 중복됐는지를 저장해주기 위한 변수
maxNum = 중복 값의 원소가 누구인지 저장해주는 변수
(1)
먼저 array[i]가 다음 원소인 array[i+1]과 동일한지 비교해줍니다.
(2)
동일하다면 count를 증가시켜줍니다.
(3)
이 값이 max보다 크다면 max를 증가된 count값으로 갱신시켜줍니다.
그럼 이 원소가 몇번이나 중복된건지 max가 기억해줄겁니다.
그리고 중복된 원소는 maxNum에 따로 저장해둡니다.
(3) - 1
그런데 증가시킨 count값이 max와 같다면 동일한 반복횟수를 가진 원소가 또 있다는 뜻이겠죠?
그럴땐 -1을 출력할 수 있게 maxNum을 -1로 저장해줍니다.
(4)
else 는 다음 원소 for문을 돌기 전에 count값을 1로 초기화시켜주기 위해 존재합니다.
오류 난 코드
import java.util.Arrays;
class Solution {
public int solution(int[] array) {
if (array.length == 1) {
return array[0];
}
int max = 1;
int maxNum = array[0];
int count = 1;
Arrays.sort(array);
for (int i=0; i<array.length-1; 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;
}
}
return maxNum;
}
}
그런데 이 코드는 오류가 납니다.
배열이 [1, 2, 3]처럼 최빈값이 없을 경우에 -1을 출력하지 못하기 때문입니다.
그래서 생각한 방법이
4. 최빈값이 존재하는 경우와 존재하지 않는 경우 구분해두기
최빈값이 존재하면 dup 변수를 true로,
최빈값이 존재하지 않는다면( ex. [1, 2, 3], [1, 1, 2, 2] ) dup 변수를 false로 저장하는겁니다.
그래서 dup이 true라면 maxNum을 출력하고,
dup이 false라면 -1을 출력해주게 했습니다.
수정 코드
import java.util.Arrays;
class Solution {
public int solution(int[] array) {
if (array.length == 1) {
return array[0];
}
int max = 1;
int maxNum = array[0];
int count = 1;
boolean dup = false;
Arrays.sort(array);
for (int i=0; i<array.length-1; i++){
if (array[i] == array[i+1]){
count++;
if (count > max){
max = count;
maxNum = array[i];
dup = true;
}
else if (count == max){
maxNum = -1;
dup = false;
}
}
else {
count = 1;
}
}
return dup ? maxNum : -1;
}
}
그럼 오류 없이 해결이 됩니다~!!!
제가 푼 코드는 아래에서도 확인하실 수 있습니다.
https://github.com/eonwy/programmers
GitHub - eonwy/programmers: 🔎 coding-test (programmers) 🔍
🔎 coding-test (programmers) 🔍. Contribute to eonwy/programmers development by creating an account on GitHub.
github.com
'🫧 코테 : CodingTest' 카테고리의 다른 글
[프로그래머스] Java : 가까운 수 (0) | 2024.03.17 |
---|---|
[프로그래머스] Java : 중복된 문자 제거(linkedHashSet) (1) | 2024.03.15 |
[프로그래머스] Java : 소인수분해(HashSet) (2) | 2024.03.14 |
[프로그래머스] Java : 구슬을 나누는 경우의 수 (0) | 2024.03.04 |
[프로그래머스] Java : 분수의 덧셈(최대공약수, 배열의 초기화) (1) | 2024.02.23 |