728x90
출처
https://www.acmicpc.net/problem/2108
내 풀이
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
//첫번째 int = 몇개나 나왔는지, 두번째 int = 값
bool compare(pair<int, int>x, pair<int, int>y)
{
//동일하게 나왔으면 오름차순으로
if (x.first == y.first)
{
return x.second < y.second;
}
//그 외는 숫자들은 내림차순
return x.first > y.first;
}
//함수들
void result1();
void result2();
void result3();
void result4();
int N = 0;
int input = 0;
vector<int>v;
//최빈값 비교 변수
int minusNum[4001];
int plusNum[4001];
vector<pair<int, int>>v2;
int main()
{
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> input;
v.push_back(input);
//최빈값 비교 위해서 넣어줌
if (input < 0)
{
input *= -1;
minusNum[input]++;
}
else plusNum[input]++;
}
sort(v.begin(), v.end());
result1();
result2();
if (N == 1) printf("%d\n", v[0]);
else result3();
result4();
}
//평균값 첫째 자리 반올림 출력
void result1()
{
double result = 0;
for (int i = 0; i < N; i++)
{
result += v[i];
}
result /= N;
//~0.5 ~ 0 사이일때 -0으로 출력되는 경우 처리
if (result > -0.5 && result < 0.5) result = 0;
printf("%.f\n", result);
}
//중앙값 출력
void result2()
{
int middle = (N - 1) / 2;
printf("%d\n", v[middle]);
}
void result3()
{
for (int i = 0; i < 4001; i++)
{
//하나라도 들어갔다면 몇번 나왔는지, 해당 숫자 벡터에 넣음
if (minusNum[i] != 0)
{
v2.push_back({ minusNum[i],-i });
}
if (plusNum[i] != 0)
{
v2.push_back({ plusNum[i],i });
}
}
sort(v2.begin(), v2.end(), compare);
//만일 최빈값이 동일하면 2번째값 출력
if (v2[0].first == v2[1].first)
{
printf("%d\n", v2[1].second);
}
else printf("%d\n", v2[0].second);
}
void result4()
{
//가장 작은 값이 0보다 작으면 양수로 변경
//ex) -8 2 -> 2 + 8 = 10, -5 -1 = -1 + 5 = 4
if (v[0] < 0)
{
v[0] *= -1;
printf("%d", v[N - 1] + v[0]);
}
else printf("%d", v[N - 1] - v[0]);
}
해설
첫번 째 줄 정답은 N개의 수들의 합을 N으로 나눈 평균값을 출력해 주었다. (double로 출력값을 선언해야 틀리지 않음)
두번 째 줄은 N은 홀수이기 때문에 정렬후 (N-1)/2번째 값을 찾으면 된다.
세번 째 줄은 벡터를 쌍으로 지정해 첫번 째에는 얼마나 나왔는지, 두번 째에는 변수 값을 저장을 저장해준 뒤
compare 함수로 직접 첫번 째 값이 같으면 변수 값 오름 차순으로, 그 외에는 얼마나 나왔는지에 대한 내림차순으로 비교해주었다.
네번 째 줄은 범위가 가장 작은수가 음수일 경우 양수로 변경해준 뒤 범위가 큰 값과 작은수를 더해주고 그 외에는
범위가 가장 큰 값과 작은 값을 빼주었다.
느낀점
정렬 생각보다 너무 어렵다.
'백준 코딩테스트 > 실버' 카테고리의 다른 글
1427) 소트인사이드 (C++) (0) | 2022.05.08 |
---|---|
9012) 괄호 (C++) (0) | 2022.05.08 |
10989) 수 정렬하기 3 (C++) (0) | 2022.05.07 |
2751) 수 정렬하기 2 (C++) (0) | 2022.05.07 |
10866) 덱 (C++) (0) | 2022.05.07 |