최빈값 구하기_programmers_lev00
<코딩 테스트>
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
<나의 풀이 과정>
알고리즘 기초 최빈값 구하기
int [] mode = new int [array.length+1];
여기서 mode 배열의 인덱스는 출현을 한 수
index의 값은 index(출현한 수)가 몇 번이 나왔는지 저장하는 용도입니다.
예를 들면 mode [3] = 5 가 들어있으면,
3이라는 숫자가 5번 출현했다는 뜻입니다!!!!!
이점을 유념하고 코드를 보시면 됩니다~
그 후 for문을 사용하여, 데이터들이 얼마큼 증가하는지를 보았습니다.
예를 들어
for(int 1=0; i <array.length;i++){
mode [ [array [i] ]++;
}
이렇게 넣게 된다면
들어오는 array가 1,2,2,3,1,4,2,2,4,3 이 있다고 하고
i가 2 일 때
mode[2] 의 값은 for문이 끝나면
1,2,2,3,1,4,2,2,4,3
mode[2] = 4; 가 저장되게 됩니다!!!
mode[2] +=1이기 때문에 2가 올 때마다 ++로 카운트를 하나씩 한 값이 저장됩니다.
(mode의 인덱스값은 array의 들어오는 숫자, 즉 같은 숫자면 같은 인덱스에 값이 ++되게 되는 뜻!!!!)
<나의 풀이 코드>
package com.programmers.level00.최빈값구하기;
public class Test {
public static void main(String[] args) {
System.out.println(solution(new int[] { 1, 2, 3, 3, 3, 4 }));// 3
}
static int solution(int[] array) {
// 최빈값 찾기
int answer = 0;
int arr_max = 0;
// array에서 가장 큰값을 arr_max에 저장
for (int i = 0; i < array.length; i++) {
if (array[i] > arr_max) {
arr_max = array[i];
}
}
// mode가 최대 몇번 나오는지 저장할 배열
int[] modeCnt = new int[arr_max + 1];
// mode 배열의 몇번째 인덱스에 최대값이 담겼는지 확인
int modeMax = 0;
// array를 돌면서 같은 인덱스의 숫자는 같은 modeCnt의 인덱스에 담기며
// 하나씩 값을 증가할 예정!
for (int i = 0; i < array.length; i++) {
modeCnt[array[i]]++;
}
// 여기서 modeCnt에 담긴 수 중 최대 값을 담고 그 값의 인덱스가 answer 가 됨.
for (int i = 0; i < modeCnt.length; i++) {
if (modeCnt[i] > modeMax) {
modeMax = modeCnt[i];
answer = i;
}
}
// 그렇다면! 이제 같은 수가 많이 있을때에는 어떻게 할까?
int sameNum = 0;
int mode = 0;
for (int i = 0; i < modeCnt.length; i++) {
mode++;
if (modeCnt[i] == modeMax) {
sameNum++;
}
}
if (sameNum > 1)
answer = -1;
return answer;
}
}
<다른 사람 풀이>
import java.util.*;
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;
}
}
<다른 사람 풀이>
class Solution {
public int solution(int[] array) {
int[] cnt = new int[1999];
for (int arr : array) {
cnt[arr + 999]++;
}
int maxCnt = -1;
int maxIdx = -1;
for (int i = 0; i < 1999; i++) {
if (cnt[i] > maxCnt) {
maxCnt = cnt[i];
maxIdx = i;
}
}
for (int i = 0; i < 1999; i++) {
if (cnt[i] == maxCnt && i != maxIdx) {
return -1;
}
}
return maxIdx - 999;
}
}
https://school.programmers.co.kr/learn/courses/30/lessons/120913
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr