https://www.acmicpc.net/problem/2456
풀이
최근에 푼 문제들 중에 제일 어려웠던 문제....쉽운 문제라고해서 덤빈건데 시간도 오래걸리고 많이 틀렷다. 계속 100%에서 틀렷다고해서ㅜ,ㅠ
1. 세 명에 대한 total 값을 저장할 배열과 점수별로 얻은 것을 count하는 2개의 배열을 선언.
입력을 받으면서 total엔 입력된 값을 +해주고, count배열에는 +1씩 해준다.
1 2 3 4 5 6 7 8 9 10 11 | void input() { scanf("%d", &num); while (num--) { int a, b, c; scanf("%d %d %d", &a, &b, &c); total[0] += a; total[1] += b; total[2] += c; count[0][a - 1]++; count[1][b - 1]++; count[2][c - 1]++; } } | cs |
2. 3 명 중에서의 최대 점수 max를 찾는다.
1 2 | max = total[0] < total[1] ? total[1] : total[0]; max = max < total[2] ? total[2] : max; | cs |
3. max값과 같은 점수를 갖는 학생을 찾닌다. 같을경우
a. 몇 명이 max값을 받는지 알기 위해 max_count라는 변수를 사용해여 max값을 갖는 학생을 세준다.
b. who_max 배열을 사용하여 누가 max값인지를 저장한다.
c. count배열은 행이 점수의 개수인 3개보다 1이 더 크다. 여기에 max값을 저장해준다.(큰 의미없다)
1 2 3 4 5 6 7 8 9 | for (int i = 0; i < 3; i++) { if (max == total[i]) { who_max[max_count] = i; //누가 max인지 max_count++;// 몇명이 max인지 count[i][3] = max;//max값을 가지는 학생의 행 끝에 max를 대입 } } | cs |
4. 이 부분이 제일 어려웠다. max_count의 개수가 2개, 3개이면 높은 점수를 많이 얻은 학생을 찾아야된다.
max_count가 1인 경우 -> max값인 학생을 그냥 출력.
max_count가 2인 경우 -> who_max에 누가 max값인지를 저장해왔으므로 높은 점수를 많이 얻은 학생을 아래 함수를 통해 얻는다. -1이면 받은 점수 별 개수도 같은 것 이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | int WHO(int a, int b) { who = -1; for (int i = 2; i >= 0; i--) { if (count[a][i] == count[b][i]) who = -1; else who = count[a][i] < count[b][i] ? b : a; if (who != -1) return who; } return who; } | cs |
max_count가 3인 경우 -> 이거 때문에 어려웠다. 모두 얻은 점수가 같을 경우이다. 우선 0번 학생과 1번 학생을 비교한다.
비교해서 who 가 -1이면 같은 경우이므로 0번과 1번 두 학생중 아무 학생이나 2번 학생과 비교해준다.
who가 -1이 아니면 who 학생과 2번 학생과 비교해준다.
이 과정을 마치고 who가 -1이면 모두 점수와 얻은 점수의 분포가 같은거다. -1이 아니면 who와 max를 출력 후 종료. 아니면 0과 max를 출력.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | if (max_count == 1) { who = who_max[0]; } else if (max_count == 2) { who = WHO(who_max[0], who_max[1]); } else if (max_count == 3) { who = WHO(who_max[0], who_max[1]); if(who==-1) who = WHO(who_max[0], who_max[2]); else who = WHO(who, who_max[2]); } if (who != -1) { printf("%d %d", who+1, max); return 0; } printf("0 %d", max); return 0; | cs |
전체 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include <stdio.h> int total[3], count[3][4], num, max, who, max_count, who_max[3]; void input(); int WHO(int a, int b); int main() { input(); max = total[0] < total[1] ? total[1] : total[0]; max = max < total[2] ? total[2] : max; for (int i = 0; i < 3; i++) { if (max == total[i]) { who_max[max_count] = i; //누가 max인지 max_count++;// 몇명이 max인지 count[i][3] = max;//max값을 가지는 학생의 행 끝에 max를 대입 } } if (max_count == 1) { who = who_max[0]; } else if (max_count == 2) { who = WHO(who_max[0], who_max[1]); } else if (max_count == 3) { who = WHO(who_max[0], who_max[1]); if(who==-1) who = WHO(who_max[0], who_max[2]); else who = WHO(who, who_max[2]); } if (who != -1) { printf("%d %d", who+1, max); return 0; } printf("0 %d", max); return 0; } int WHO(int a, int b) { who = -1; for (int i = 2; i >= 0; i--) { if (count[a][i] == count[b][i])//점수 분포가 같으면 -1 who = -1; else who = count[a][i] < count[b][i] ? b : a;//점수 분포가 큰 애를 return if (who != -1) return who; } return who; } void input()//입력 { scanf("%d", &num); while (num--) { int a, b, c; scanf("%d %d %d", &a, &b, &c); total[0] += a; total[1] += b; total[2] += c;//total계산 count[0][a - 1]++; count[1][b - 1]++; count[2][c - 1]++;//점수 얻은 개수 count } } | cs |
'SW 업무 관련 > 백준' 카테고리의 다른 글
[BAEKJOON] 2606_바이러스 (0) | 2018.06.06 |
---|---|
[BEAKJOON] 풀었던 문제들 복습 - 1편(1000번,1001번,1003번,1008번,1057번) (0) | 2017.09.17 |
[BEAKJOON] 2146_다리 만들기_C언어 (0) | 2017.09.08 |
[BEAKJOON] 11559_puyo puyo(뿌요뿌요)_C언어 (0) | 2017.09.08 |
[BEAKJOON] 1251_단어 나누기_C언어 (0) | 2017.09.08 |