문제
풀이
int n; // n은 홀수
cin >> n;
int *num = new int[n];
int AM = 0; //(arithmetic mean)산술평균
for (int i = 0; i < n; i++)
{
int temp;
cin >> temp;
num[i] = temp;
AM += temp; //산술평균 계산용
}
cout << (int)(round((float)AM / n)) << endl; //산술평균 출력
//소숫점 첫째자리에서 반올림
//#include<cmath> 해줘야함
먼저 몇개의 수를 입력받을지 n을 입력받습니다.
그만큼 배열을 동적할당 해준 후, 숫자를 순서대로 입력받습니다.
그 과정에서 산술평균 계산을 위해 각 숫자들을 모두 더해준 다음, 소수점 이하 첫째자리에서 반올림한 값을 출력해줍니다.
(cmath 헤더파일을 포함해줘야합니다.)
sort(num, num + n); //#include <algorithm>필요
cout << num[n / 2] << endl; //중앙값 출력
sort함수를 통해서 입력받은 수를 오름차순으로 정렬해준 후,
중앙값을 출력해줍니다.
int MaxCount = 1;
int count = 1;
int choi = num[0];
bool is_first = true;
for (int i = 1; i < n; i++)
{
if (num[i] == num[i - 1])
{
count++;
if(i==n-1)
{
if(count>MaxCount)
choi=num[i];
else if(count==MaxCount && is_first==true)
choi=num[i];
}
}
else
{
if(MaxCount==1 && count==1 && is_first==true)
{
choi=num[i];
is_first=false;
}
else if (count > MaxCount)
{
choi = num[i-1];
MaxCount=count;
is_first=true;
}
else if (count == MaxCount && is_first == true)
{
choi = num[i - 1];
is_first = false;
}
count = 1;
}
}
cout << choi << endl; //최빈값 출력
cout << num[n - 1] - num[0]; //범위
최빈값을 구하는 부분입니다.
choi =>최빈값 저장 변수
count =>현재 몇연속으로 해당 숫자가 나왔는지
MaxCount =>지금까지 가장 많이 나온 숫자의 횟수
is_first =>두 번째로 작은 최빈값인지 판별하기 위한 bool변수
문제에서 최빈값이 여러개 있을 경우, 두 번째로 작은 값을 출력하라 했기때문에 위와같이 좀 긴 코드가 되었습니다.
최빈값을 구하는 매커니즘은 다음과 같습니다. (이미 오름차순으로 정렬했기 때문에 가능한 방법)
for문을 통해 처음부터 끝까지 검사를 합니다.
바로 전 숫자랑 현재 숫자랑 같으면 count++를 해줍니다.
숫자가 달라지면 count와 MaxCount(최고로 많이 나온 수의 갯수)를 비교합니다.이때, count>MaxCount라면 최빈값(choi)=num[i-1]으로 갱신하고 MaxCount=count로 갱신해줍니다. 그리고 is_first=true로 초기화해줍니다.(첫번째 최빈값이기 때문에)
그게 아니라 count==MaxCount이고, is_first==true라면 현재시점에서 2번째로 작은 최빈값이기때문에 최빈값(choi)=num[i-1]으로 갱신하고 is_first=false로 해줍니다. is_first=false로 해줘야 다음에 같은 횟수의 또 다른 최빈값이 등장했을때 2번째로 작은 값이 아니라는걸 판별할 수 있습니다.
위 메커니즘을 적용+예외적인 상황 처리를 한 것이 위 코드입니다.
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
백준-좌표 정렬하기(11650번) (0) | 2022.08.21 |
---|---|
백준-소트인사이드(1427번) (0) | 2022.08.20 |
백준-커트라인(25305번) (0) | 2022.08.15 |
백준-수 정렬하기(2750번) (0) | 2022.08.15 |
백준-영화감독 숌(1436번) (0) | 2022.08.14 |