찰리의 놀이터

(C언어) 나는 학급회장이다 - 백준 2456번 본문

알고리즘 공부

(C언어) 나는 학급회장이다 - 백준 2456번

차알리 2021. 4. 16. 22:10

나는 학급회장이다.(투표)

시간제한: 1 Sec 메모리제한: 32 MB

제출: 2219 해결: 508

N명의 학생들이 모인 초등학교 반에서 학급회장 선거를 하려고 한다. 그 중 3명이 회장후보로 나왔고, 이들에 대한 선호도를 N명의 학생들 각각에게 적어내도록 하였다. 세 명의 후보는 후보 1, 후보 2, 후보 3번이라 한다.

모든 학생은 3명의 후보 중에서 가장 선호하는 후보에게는 3, 두 번째로 선호하는 후보에게는 2, 가장 선호하지 않는 후보에게는 1점을 주어야 한다. 3명의 후보에 대한 한 학생의 선호 점수는 모두 다르며, 1, 2, 3점이 정확히 한 번씩 나타나야 한다.

후보의 최종 점수는 학생들로부터 받은 자신의 선호도 점수를 모두 더한 값이 된다. 그러면 3명의 후보 중 가장 큰 점수를 받은 후보가 회장으로 결정된다. , 점수가 가장 큰 후보가 여러 명인 경우에는 3점을 더 많이 받은 후보를 회장으로 결정하고, 3점을 받은 횟수가 같은 경우에는 2점을 더 많이 받은 후보를 회장으로 결정한다. 그러나 3점과 2점을 받은 횟수가 모두 동일하면, 1점을 받은 횟수도 같을 수밖에 없어 회장을 결정하지 못하게 된다.

여러분은 선호도 투표를 통해 얻은 세 후보의 점수를 계산한 후, 유일하게 회장이 결정되는 경우에는 회장으로 결정된 후보의 번호(1, 2, 3 중 한 번호)와 최고 점수를 출력하고, 회장을 결정하지 못하는 경우에는 번호 0과 최고 점수를 출력하는 프로그램을 작성하시오.

입력 파일의 첫째 줄에는 반의 학생들의 수 N(3N1,000)이 주어진다. 다음 N개의 각 줄에는 각 학생이 제출한 회장후보 3명에 대한 선호 점수가 주어지는 데, 첫 번째 점수는 후보 1번에 대한 점수이고 두 번째 점수는 후보 2번에 대한 점수이고 세 번째 점수는 후보 3번에 대한 점수이다. 이 세 점수는 서로 다르며, 1, 2, 3이 정확히 한 번씩 나타난다.

학생들의 선호도 투표 결과로부터, 회장이 유일하게 결정되는 경우에는 회장으로 결정된 후보의 번호와 최고 점수를 출력하고, 유일하게 결정할 수 없는 경우에는 0과 최고 점수를 출력한다.

 

6

3 1 2

2 3 1

3 1 2

1 2 3

3 1 2

1 2 3

1 13

6

1 2 3

3 1 2

2 3 1

1 2 3

3 1 2

2 3 1

0 12

------------------------------------------------문제풀이---------------------------------------------------------------------

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//학급회장
int arr[3][4];
int main(void)
{
int n, i, j, k1, k2, president, max=0;
int m1, m2, m3;
scanf("%d", &n);
for(i=0;i<n;i++)
{
scanf("%d %d %d", &m1, &m2, &m3);
arr[0][m1]++;
arr[1][m2]++;
arr[2][m3]++;
arr[0][0] += m1;
arr[1][0] += m2;
arr[2][0] += m3;
for(j=0;j<3;j++)
{
if(max<arr[j][0])
{
max = arr[j][0];
k1 = j;
}
else if (max == arr[j][0])
{
k2 = j;
}
}
}
if(k1==k2)
{
president = k1;
}
else
{
if(arr[k1][3]==arr[k2][3])
{
if(arr[k1][2]==arr[k2][2])
{
if(arr[k1][1]==arr[k2][1])
president = -1; //배열은 0부터 시작이므로 차이점을 둠
else if(arr[k1][1]>arr[k2][1])
president = k1;
else
president = k2;
}
else if(arr[k1][2]>arr[k2][2])
president = k1;
else
president = k2;
}
else if(arr[k1][3]>arr[k2][3])
president = k1;
else
president = k2;
}
printf("%d %d", president+1, max); //배열에서 0부터 시작했기때문에 1을 더해줌
}
view raw e_2_5.c hosted with ❤ by GitHub