[백준] 2108 통계학 - Java

iamjinseo·2021년 7월 15일
0

문제풀이-Java

목록 보기
1/53

문제


풀이

package solve1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main11 {
//2108 정렬4 Main11
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //입력
		int size;
		do {
			size = Integer.parseInt(br.readLine());
		} while (size % 2 == 0); // N개의 수는 홀수여야 함

		ArrayList<Integer> list = new ArrayList<>(); // Integer 리스트

		for (int i = 0; i < size; i++)
			list.add(Integer.parseInt(br.readLine())); //리스트에 입력
		Collections.sort(list); // 정렬

		double sum = 0;
		for (int value : list) // sum 계산 및 빈도 계산
			sum += value;

		double avg = Math.round(sum / list.size()); // 1.평균
		int median = list.get(list.size() / 2); // 중앙값
		int mode = mode(list);
		int range = list.get(list.size() - 1) - list.get(0); // 범위
		System.out.println((int) avg + "\n" + median + "\n" + mode + "\n" + range + "\n");
	}

	static int mode(ArrayList<Integer> list) { //최빈값
		int[] cnt = new int[8001]; //입력되는 정수의 최대 절댓값은 4000
		ArrayList<Integer> indexlist = new ArrayList<Integer>();
		int max = 2;
		for (int value : list) { //리스트의 각 수들 검사
			cnt[value + 4000]++; //그 수의 빈도 높이기
			if (cnt[value + 4000] > max) { //최빈값 이상의 값 등장
				max = cnt[value + 4000];
				indexlist.clear(); //최빈값 리스트 클리어
				indexlist.add(value); //새로운 최빈값 삽입
			} else if (cnt[value + 4000] == max) { //최빈값
				indexlist.add(value); //최빈값 리스트에 삽입
			}
		}
		if (indexlist.isEmpty()) { //최빈값이 모두 1로 같으면
			if (list.size() == 1) //수가 하나뿐이면 
				return list.get(0); //하나의 수 출력
			else
				return list.get(1); // 두 번째로 작은 값 출력
		} else if (indexlist.size() == 1) { //최빈값이 하나
			return indexlist.get(0);
		} else {
			return indexlist.get(1);
		}
	}
}

그래도 다른 자바 유저들보다 실행 속도가 빠르다!!!


실화냐?!
실화다.
이 문제가 뭐라고....아직 한참 멀었군

profile
일단 뭐라도 해보는 중

0개의 댓글