대표값

이윤설·2024년 4월 6일

제출코드

import java.io.*;
import java.util.*;

class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        List<Integer> list = new ArrayList<>();

        for (int i = 0; i < 10; i++) {
            int number = Integer.parseInt(br.readLine());
            list.add(number);
        }

        int average = calcAverage(list);
        int mode = calcMode(list);

        System.out.println(average);
        System.out.println(mode);
    }

    static int calcAverage(List<Integer> list) {
        int sum = 0;
        for (int i = 0; i < list.size(); i++) {
            sum += list.get(i);
        }
        int answer = sum / 10;
        return answer;
    }

    static int calcMode(List<Integer> list) {
        Map<Integer, Integer> map = new HashMap<>();

        /** !!! 주의 !!! count가 항상 0으로 초기화되는 문제 발생
        for (int i = 0; i < list.size(); i++) {
            int count = 0;
            map.put(list.get(i), count++);
        }


        for (int i = 0; i < list.size(); i++) {
            int count = map.getOrDefault(list.get(i), 0);
            map.put(list.get(i), count + 1);
        }

        int key = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey();
        return key;
    }
   
}
  • 원래 작성한 반복문은 count가 항상 0으로 초기화 된다.
        for (int i = 0; i < list.size(); i++) {
            int count = 0;
            map.put(list.get(i), count++);
        }

왜냐하면 반복문 첫번째 줄에서 0으로 항상 초기화 되기 때문이다.

Map에다가 값을 누적시킬 경우에는 getOrDefault()를 사용하면 된다.

        for (int i = 0; i < list.size(); i++) {
            int count = map.getOrDefault(list.get(i), 0);
            map.put(list.get(i), count + 1);
        }
  • 스트림을 사용하여 가장 값이 큰 value의 key를 가져올 수 있지만, 더 나은 방법이 존재한다.

모범답안

public class Main {
    private static BufferedWriter bw = new BufferedWriter
    (new OutputStreamWriter(System.out));
    
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int arr[] = new int[1001];
        int sum = 0;
        
        for (int i = 0; i < 10; i++) {
            int N = Integer.parseInt(br.readLine());
            sum += N;
            arr[N]++;
        }
        
        int max = 0;
        int maxIdx = 0;
        for (int i = 0; i < 1001; i++) {
            if (max < arr[i]) {
                max = arr[i];
                maxIdx = i;

            }
        }
        bw.write(sum / 10 + "\n");
        bw.write(String.valueOf(maxIdx));
        bw.flush();
    }
}

배운점

가장 많이 입력된 값을 알아내는 가장 쉬운 방법 (중요)

  • 값을 최대 1000개를 입력받을 수 있으므로, 1001개의 배열을 생성한다.
  • 입력된 숫자와 동일한 배열의 인덱스에 1을 더한다. 만약 4가 2번 들어갔으면 array[4] = 2다.
  • 반복문으로 배열을 차례대로 반복하면서 max 값과 maxIdx 값을 업데이트 한다.
  • 반복문이 끝나면 maxIdx를 출력한다.
profile
화려한 외면이 아닌 단단한 내면

0개의 댓글