import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n;
int sum = 0;
int modeFrequency = 0; // 최빈값의 최대 빈도수
int modeCount = 0; // 최대 최빈값을 가지는 숫자의 개수
int mode = 0; // 최빈값
int[] ary = new int[101];
for (int i = 0; i < 10; i++) {
n = sc.nextInt();
sum += n; // 입력받은 숫자를 계속 더해줌
ary[n / 10]++; // 입력받은 정수의 빈도수를 ary배열에 체크, 10의 배수이고 배열의 크기를 줄이기 위해 10으로 나눔. 나중에 출력할 땐 x10을 해야함
if (ary[n / 10] > modeFrequency) { // 최빈값의 최대 빈도수를 찾음
modeFrequency = ary[n / 10];
}
}
for (int k = 1; k < 101; k++) {
if (ary[k] == modeFrequency) { // 최빈값의 최대 빈도수를 가진 숫자가 몇개 있는지 구함
modeCount++;
mode = k * 10; // modeCount가 1개인 경우, 바로 그 값을 찾이위해 사용. modeCount > 1이면 사용되지 않음
}
}
if (modeCount == 1) { // 최빈값이 하나인 경우 최빈값, 평균을 출력
System.out.println(sum / 10);
System.out.println(mode);
} else {
System.out.println(sum / 10);
for (int j = 0; j < 101; j++) { // 최빈값이 2보다 큰 경우, 배열 앞에서 부터 탐색하면서 최대 빈도수를 가진 숫자를 출력
if (ary[j] == modeFrequency) {
System.out.println(j * 10);
return;
}
}
}
}
}
문제는 입력받은 정수들의 평균과 최빈값을 구하는 문제이다. 평균은 모두 더해서 10으로 나누면 될 것이고 최빈값은 만약 하나인경우 하나만 출력하고 1개보다 많을 경우 최빈값 중 가장 작은 값을 출력하는 문제이다.
먼저 정수를 입력받으면서 sum에 모두 더해주고, 101크기의 배열에 입력받은 정수를 10으로 나눈 값을 인덱스로 하여 그 인덱스의 값에 ++을 해줍니다. 10으로 나눈 이유는 입력받은 정수가 10의 배수이기 때문에 10/10 = 1이게 되고 배열의 1번쨰 인덱스에 ++하는 것은 10이 한번 사용되었다는 것을 의미합니다.
이렇게 배열에 입력받은 값의 빈도수를 체크하고 빈도수중에 가장 큰 값을 구합니다. 최빈값의 최대 빈도수를 찾는 것이죠. 다시 ary을 돌면서 ary배열의 값(입력받은 숫자의 빈도수)과 위에서 구한 최대빈도수르가 같으면 modeCount++를 해주게 됩니다. 이 과정을 최빈값이 몇개 존재하는 지 알기 위함입니다. 동시에 mode값도 구해주는데 이는 최빈값입니다. modeCount가 1이면 바로 mode를 출력하면 됩니다. modeCount가 1개보다 많으면 mode값은 의미가 없죠.
마지막으로 modeCount가 1이면 평균값과 mode값을 출력해주고, 1보다 크면 평균값을 출력하고, ary를 돌면서 최빈값을 가지는 인덱스에 10을 곱하여 출력하게 됩니다.
'알고리즘 문제' 카테고리의 다른 글
[알고리즘 문제] Seat (0) | 2019.04.04 |
---|---|
[알고리즘 문제] Tetris (0) | 2019.04.03 |
[알고리즘] Class President (0) | 2019.04.02 |
[알고리즘 문제] Mine (0) | 2019.03.31 |
[알고리즘 문제] ColorPaper (0) | 2019.03.30 |