눈팅하는 게임개발자 블로그
백준 알고리즘 2108 본문
#include
#include #include #include #include using namespace std; int frequent(int b[], int N) { int max = 0; vector v; for (int i = 4000; i >= 0; i--) { if (max < b[i]) { max = b[i]; v.clear(); v.push_back(i*(-1)); } else if (max == b[i]) { v.push_back(i*(-1)); } } for (int i = 4001; i < 8001; i++) { if (max < b[i]) { max = b[i]; v.clear(); v.push_back(i - 4000); } else if (max == b[i]) { v.push_back(i - 4000); } } if (v.size() == N) { return 9000; } if (v.size() >1) { return v[1]; } else { return v[0]; } } int func_compare(const void * first, const void * second) { if (*(int*)first > *(int *)second) return 1; else if (*(int*)first < *(int *)second) return -1; else return 0; } int main() { int N; cin >> N; int a[500000], b[8001]; memset(&b[0], 0, 8001 * 4); int sum = 0; for (int i = 0; i < N; i++) { cin >> a[i]; sum += a[i]; if (a[i] > 0) { b[4000 + a[i]]++; } else if (a[i] < 0) b[-1 * a[i]]++; else b[0]++; } double avg = (double)sum / N; avg = floor(avg + 0.5); int arrsize = N; qsort((int *)a,arrsize, sizeof(int), func_compare); int center = a[N / 2]; int fre = frequent(b, N); if (fre == 9000) { if(N!=1) fre = a[1]; if (N == 1) fre = a[0]; } int range = a[N - 1] - a[0]; cout << avg << "\n" << center << "\n" << fre << "\n" << range << "\n"; // while (1); return 0; }
처음 설계가 잘못되어서 많이 고생했다.
음수는 -1을 곱해줘서 인덱스로 쓰고 0은 0번인덱스, 양수는 +4000을 해줘서 4001번 이후의 인덱스에 저장해서 사용.
그런 이유로 가장 작은수부터 판별하여 반복문을 시행해야 되는 부분에서 4000~0, 이후 4001~8000의 순서로 반복문을 시행해줘야 한다.
모든 값의 빈도수가 1일경우에 대한 조건문도 추가. 그리고 N이 1일 경우에 대한 조건문 또한 추가.
그 외로는 math.h의 floor함수를 사용해서 반올림 정도.
'공부한거 > 백준알고리즘' 카테고리의 다른 글
백준 알고리즘 1966 (0) | 2018.05.16 |
---|---|
백준 알고리즘 9020 (0) | 2018.01.12 |
백준 알고리즘 10989 (0) | 2018.01.05 |
백준 알고리즘 6064 (0) | 2018.01.02 |
백준 알고리즘 2775 (1) | 2017.12.29 |