jju_developer 2023. 1. 1. 22:00
728x90

<코딩 테스트>

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 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

 

728x90