와챠의 우당탕탕 코딩 일기장
[백준]14-정렬/4-통계학/2108(C, JAVA) 풀이 본문
문제
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
-
산술평균 : N개의 수들의 합을 N으로 나눈 값
-
중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
-
최빈값 : N개의 수들 중 가장 많이 나타나는 값
-
범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 그다음 N개의 줄에는 정수들이 주어진다.
입력되는 정수의 절댓값은 4,000을 넘지 않는다.
출력
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
풀이 1(C)
풀이 2(C)
풀이 1(JAVA)
풀이 2(JAVA)
이 문제... 지금까지 백준 문제 풀면서 가장 많은 오류를 냈다...
허버허버 오답노트
오류 1
원래 풀이 1(C)에서 num 배열을 동적 할당으로 안 하고
int num[500001]해서 입력받았었다... 그냥 이렇게 해도 될 줄 알았다.
실제로 되긴 됐다.
그래서 풀이 1(JAVA)에서도 int[] num = new int[50001]로 해서 풀었더니... 안 되는 거다...!!!!!
코드 한참 들여다보다가 뭐가 틀렸는지 진짜 모르겠어서 이클립스에 하나하나 결과 출력해보면서 해봤더니
오름차순 배열이 문제였음을 발견했다.
C언어로 오름차순 정렬할 때 qsort함수를 썼었고, 인수로 배열의 개수를 받았었다.
※qsort(정렬할 배열의 첫 번째 포인터, 배열의 개수, 배열 하나의 크기, 비교 함수)
그래서 오름차순으로 정렬할 때 어디까지 정렬해야 할지 컴퓨터가 알 수 있었다.
근데 JAVA로 오름차순 정렬 때 Arrays.sort를 썼었고...
이건 전체 배열에 대해서 오름차순을 하는 거라 배열이 이상하게 정렬된 거였다.
예시를 들면, N=3일 때 num배열은 인덱스 0부터 2까지 입력을 받는다.
내가 1, 2, 3을 입력하고 Arrays.sort로 오름차순 정렬을 하면 num[0]=0, num[1]=0, num[2]=0 이 된다...
왜냐면 num은 인덱스가 2까지 있는 게 아니라 500000까지 있으니까.........
빈 방들엔 0이 있고 그게 젤 작으니 저렇게 오름차순 배열이 된 거다.
쓰다 보니까 어떻게 이런 어처구니없는 오류를 냈는지 참... 부끄럽네
오름차순에 대한 이해가 부족했나 보다...^^
이제 안 틀리겠지
오류 2
풀이 2(JAVA)에서 산술평균 출력할 때
(int) Math.round((double) sum / (double) N));
여기서 double을 안 써줘서 틀렸었다...
이것도 정말 당연하게도 소수점 첫째 자리에서 반올림해야 하는데
int형으로 되어있는 sum, N은 소수점이 없어서 반올림할 수 없기 때문...
그래서 9 / 5 했을 때 문제에서 요구하는 대로라면 2가 나와야 하는데 1이 나와서 틀렸던 것이다.
문제를 잘 보자ㅎ
int로 형변환하는 것도 첨에 안 써줘서 손실 난다고 컴파일 오류 났다.
딴 얘긴데 double을 float로 바꿔도 되고 한쪽을 지워도 되는데 안 지운 것보다 오래 걸렸다.
오류 3
풀이 2(C, JAVA) - 중앙값 구하는 함수에서 빠져나오는 if 부분!!
if (cnt >N/2)
이 부분도... 엥 cnt >= N / 2여야 되는 거 아냐? 하면서 고쳤다가
틀렸다...
삐걱삐걱 머리를 굴려보니 cnt는 중앙값의 인덱스가 아니라 인덱스가 될 값이라
원래 중앙값보다 1만큼 크다는 것을 깨달았다...
그래서 N / 2보다 커야 함...ㅋ 크거나 같은 게 아니라...
어떻게 이런 실수를
어제부터 네이버 웨일 다크 모드 써봤더니 사진도 검정이다.
눈이 좀 편한 것 같긴 하다.
글고 이건 다른 말인데
컴퓨터도 무식한 거 같다.ㅡㅡ
내가 for문 만들면서 컴퓨터 계산하기 쉬우라고
여기서부터는 계산 안 해도 돼~라는 if 문을 넣었는데
무식하게 빠르기만 한 컴퓨터에게는...
if문을 매번 확인하는 것보단 걍 첨부터 끝까지 for문을 도는 게 좋은 것이다...(if문 넣어서 시간 더 나온 사람)
ㅇㅣ 바보 내 맘도 모르고
암튼 이런 자잘하고 멍청한 실수는 컴퓨터 구조를 배우면 무조건 고쳐질 것이다!!
증원 메일을 이렇게 열정적으로 보낼 걸...
교수님 제발 증원해주세요.
'코딩 일기장 > 백준' 카테고리의 다른 글
[백준]14-정렬/6-좌표 정렬하기/11650(C, JAVA) 풀이 (0) | 2020.08.26 |
---|---|
[백준]14-정렬/5-소트인사이드/1427(C, JAVA) 풀이 (0) | 2020.08.26 |
[백준]14-정렬/3-수 정렬하기3/10989(C, JAVA) 풀이 (0) | 2020.08.24 |
[백준]14-정렬/2-수 정렬하기2/2751(C, JAVA) 풀이 (0) | 2020.08.23 |
[백준]14-정렬/1-수 정렬하기/2750(C, JAVA) 풀이 (0) | 2020.08.22 |