[BEAKJOON] 2456_나는 학급회장이다_C언어

SW 업무 관련/백준

[BEAKJOON] 2456_나는 학급회장이다_C언어

WillBe_ 2017. 9. 10. 18:28

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