처음부터 차근차근

class2 - 2108번 통계학 (자바) 본문

알고리즘

class2 - 2108번 통계학 (자바)

_soyoung 2024. 5. 22. 16:07
반응형

문제 : https://www.acmicpc.net/problem/2108

 

최빈값 구하는데 시간이 너무 오래걸렸었다.

입력값으로 음수가 들어와서 최빈값 구할 때 배열을 하나 더 만들었어야 했었고,

여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력하라는 조건도 있어서 로직이 복잡했다ㅠㅠ

결국 최빈값 부분은 해답을 보고 풀었었는데, 코드를 짧고 간결하게 잘짠 사람들이 많아서 대단하게 느껴졌다... 

 

문제에서 사용한 개념

Math.round(소수) : 소수점 첫번째자리에서 반올림 하여 정수를 리턴함. 가장 가까운 정수를 리턴한다고 생각하면 편함.

리턴 형식 매개변수
long round(double a)
int round(float a)

 

공식 문서 : https://docs.oracle.com/javase/7/docs/api/java/lang/Math.html

 

풀이

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

public class Main
{
	public static void main(String[] args) {
		try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            
            int num = Integer.parseInt(br.readLine());
            int[] arr = new int[num];
            int sum = 0; // 합
          
            
            for (int i = 0; i < num; i++) {
                arr[i] = Integer.parseInt(br.readLine());
                sum += arr[i];
            }
            
            // 산술평균
            long arithmeticMean = Math.round((double)sum / num);
            
            // 중앙값 
            Arrays.sort(arr);
            int median = arr[(num -1) / 2];
            
            // 최빈값 
            int[] count = new int[8001]; // 빈도 수 카운팅 배열
            int mode = 0; // 최빈값
            int maxCount = 0; // 카운트 최대값
            boolean flag = false; // 두번째 최빈값 찾기 위한 플래그
            
            for (int i = 0; i < arr.length; i++) {
                count[arr[i] + 4000]++;
            }
            
            for (int i = 0; i < count.length; i++) { // 최빈값 찾기
                if (count[i] > maxCount) {
                    mode = i - 4000;
                    maxCount = count[i];
                    flag = true;
                } else if (count[i] == maxCount && flag == true) {
                    mode = i - 4000;
                    flag = false;
                }
            }
           
            // 범위
            int range = arr[num - 1] - arr[0];
            
            bw.write(String.valueOf(arithmeticMean)+"\n"); // 산술평균
            bw.write(String.valueOf(median)+"\n"); // 중앙값
            bw.write(String.valueOf(mode)+"\n"); // 최빈값
            bw.write(String.valueOf(range)+"\n"); // 범위
           
            br.close();
            bw.flush();
            bw.close();
		}
		catch (IOException e) {
          System.out.println("IOException 발생");
		}
		
	}
}

예제는 모두 맞았는데 답 제출하기만 하면 틀렸다고 나와서 한참을 찾아보다가 산술평균 반환 형식이 잘못됐다는 것을 깨달았다.

double형 매개변수를 넣었으면 리턴 형식이 long인데 int형을 써서 에러가 났었다...

반응형
Comments