문제
https://www.acmicpc.net/problem/2108
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
코드 (틀렸습니다)
예제 테스트케이스는 통과한다.
(아마 산술 평균에서 틀린거 같다. 이런 방법이 아니라 반올림을 사용했어야 했다)
최빈값은 -4000~4000 까지 담을 수 있는 int 형 배열을 선언한 뒤 숫자+4000 인덱스에 빈도수를 더하도록 했다.
아래 코드의 arr 배열과 처음 for문을 참고하면 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
ArrayList<Integer> tmpList = new ArrayList<>();
int[] arr = new int[8001];
for(int i=0; i<N; i++) {
int tmp = Integer.parseInt(br.readLine());
tmpList.add(tmp);
arr[tmp+4000]++;
}
Collections.sort(tmpList);
int sum4avg = 0;
int median = 0;
int idx=0;
int min=0, max=0;
for(int data : tmpList) {
if(idx==0)
min=data;
if(idx==tmpList.size()-1)
max=data;
sum4avg += data;
//중앙값
if(idx==N/2) {
median = data;
}
idx++;
}
//산술평균
int avg = sum4avg/N;
if(avg<0 && sum4avg%N!=0)
avg--;
//범위
int range = max-min;
//최빈값
int mode = 0;
int cnt = 0;
for(int i=0; i<8001; i++) {
if(arr[i]>cnt) {
cnt=arr[i];
}
}
int maxCnt = 0;
for(int i=0; i<8001; i++) {
if(arr[i]==cnt && maxCnt==0 ) {
mode=i;
maxCnt++;
}else if(arr[i]==cnt && maxCnt==1) {
mode=i;
break;
}
}
mode-=4000;
sb.append(avg).append("\n");
sb.append(median).append("\n");
sb.append(mode).append("\n");
sb.append(range).append("\n");
System.out.println(sb);
}
}
새로운 코드
list의 get을 사용하면 범위도, 중앙값도 쉽게 나온다
평균은 반올림 내장함수를 사용했다.
최빈값은 -4000~4000 까지 담을 수 있는 int 형 배열을 선언한 뒤 숫자+4000 인덱스에 빈도수를 더하도록 했다.
아래 코드의 arr 배열과 처음 for문을 참고하면 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
ArrayList<Integer> list = new ArrayList<>();
int[] arr = new int[8001];
for(int i=0; i<N; i++) {
int tmp = Integer.parseInt(br.readLine());
list.add(tmp);
arr[tmp+4000]++;
}
Collections.sort(list);
//중앙값
int median = list.get(N/2);
//산술평균
int sum4avg = 0;
for(int data : list) {
sum4avg += data;
}
int avg = (int) Math.round((double)sum4avg/N);
//범위
int range = list.get(list.size()-1)-list.get(0);
//최빈값
int mode = 0;
int cnt = 0;
for(int i=0; i<8001; i++) {
if(arr[i]>cnt) {
cnt=arr[i];
}
}
int maxCnt = 0;
for(int i=0; i<8001; i++) {
if(arr[i]==cnt && maxCnt==0 ) {
mode=i;
maxCnt++;
}else if(arr[i]==cnt && maxCnt==1) {
mode=i;
break;
}
}
mode-=4000;
sb.append(avg).append("\n");
sb.append(median).append("\n");
sb.append(mode).append("\n");
sb.append(range).append("\n");
System.out.println(sb);
}
}
아이고 속 시원하다.
'Preparing Coding Test > Baekjoon' 카테고리의 다른 글
[Java/백준/브루트 포스] 2231 - 분해합 (0) | 2020.08.26 |
---|---|
[Java/백준/브루트 포스] 2798 - 블랙잭 (0) | 2020.08.26 |
[Java/백준/정렬] 2750 - 수 정렬하기 (0) | 2020.08.20 |
[Java/백준/정렬] 10989 - 수 정렬하기 3 (using Counting Sort) (0) | 2020.08.20 |
[Java/백준/정렬] 2751 - 수 정렬하기 2 (0) | 2020.08.20 |