DY N DY

실력키우기 나는 학급회장이다. (투표) (C++) 본문

PARK/ALGORITHM

실력키우기 나는 학급회장이다. (투표) (C++)

손세지 2016. 8. 4. 09:22

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

제한시간: 1000 ms    메모리제한: 32 MB
해결횟수: 1082 회    시도횟수: 4221 회   



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(3≤N≤1,000)이 주어진다. 

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



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


 [Copy]
6
3 1 2
2 3 1
3 1 2
1 2 3
3 1 2
1 2 3
 [Copy]
1 13



 [Copy]
6
1 2 3
3 1 2
2 3 1
1 2 3
3 1 2
2 3 1
 [Copy]
0 12



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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/**************************************************************
    Problem: 2460
    User: a132034
    Language: C++
    Result: Success
    Time:1 ms
    Memory:1740 kb
****************************************************************/
 
 
#include    <iostream>
using namespace std;
 
int main()
{
    int N;
    int ** pps;
 
    cin >> N;
    pps = new int *[N + 3];  // N번째는 3점을 받은 횟수, N+1번째는 2점을 받은 횟수, N+2번째는 점수합
    for (int i = 0; i < N + 3++i)
        pps[i] = new int[3];
 
    for (int i = 0; i < N + 3++i)
    {
        for (int j = 0; j < 3;++j)
        {
            pps[i][j] = 0;
        }
    }
 
    for (int i = 0; i < N; ++i)
    {
        for (int j = 0; j < 3++j)
        {
            cin >> pps[i][j];
            pps[N + 2][j] += pps[i][j];
            if (pps[i][j] == 3)
                pps[N][j]++;
            else if (pps[i][j] == 2)
                pps[N + 1][j]++;
        }
    }
 
        if (pps[N + 2][0> pps[N + 2][1&& pps[N + 2][0> pps[N + 2][2])
    {
        //1이 가장 큰 경우 
        cout << 1 << " " << pps[N + 2][0];
    }
    else if (pps[N + 2][1> pps[N + 2][0&& pps[N + 2][1> pps[N + 2][2])
    {
        //2가 가장 큰 경우
        cout << 2 << " " << pps[N + 2][1];
    }
    else if (pps[N + 2][2> pps[N + 2][0&& pps[N + 2][2> pps[N + 2][1])
    {
        //3이 가장 큰 경우
        cout << 3 << " " << pps[N + 2][2];
    }
    else if (pps[N + 2][0== pps[N + 2][1&& pps[N + 2][0>= pps[N + 2][2])
    {
        //1,2가 동일하고 큰 수인 경우
        if (pps[N][0> pps[N][1])
            cout << 1 << " " << pps[N + 2][0];
        else if (pps[N][1> pps[N][0])
            cout << 2 << " " << pps[N + 2][1];
        else
        {
            if(pps[N+1][0> pps[N+1][1])
                cout << 1 << " " << pps[N + 2][0];
            else if(pps[N + 1][0< pps[N + 1][1])
                cout << 2 << " " << pps[N + 2][1];
            else
                cout << 0 << " " << pps[N + 2][0];
        }
    }
    else if (pps[N + 2][0== pps[N + 2][2&& pps[N + 2][0>= pps[N + 2][1])
    {
        //1,3이 동일하고 큰 수인 경우
        if (pps[N][0> pps[N][2])
            cout << 1 << " " << pps[N + 2][0];
        else if (pps[N][2< pps[N][0])
            cout << 3 << " " << pps[N + 2][2];
        else
        {
            if(pps[N+1][0> pps[N+1][2])
                cout << 1 << " " << pps[N + 2][0];
            else if(pps[N+1][2> pps[N+1][0])
                cout << 3 << " " << pps[N + 2][2];
            else
                cout << 0 << " " << pps[N + 2][0];
        }
    }
    else if (pps[N + 2][1== pps[N + 2][2&& pps[N + 2][1>= pps[N + 2][0])
    {
        //2,3이 동일하고 큰 수인 경우
        if (pps[N][1> pps[N][2])
            cout << 2 << " " << pps[N + 2][1];
        else if (pps[N][1< pps[N][2])
            cout << 3 << " " << pps[N + 2][2];
        else
        {
            if (pps[N + 1][1> pps[N + 1][2])
                cout << 2 << " " << pps[N + 2][1];
            else if (pps[N + 1][2> pps[N + 1][1])
                cout << 3 << " " << pps[N + 2][2];
            else
                cout << 0 << " " << pps[N + 2][2];
        }
    }
    else
    {
        cout << 0 << " " << pps[N + 2][0];
    }
 
 
    return 0;
}
cs


정말 단순하게 생각했다. 


기존에 1~3번 학생의 점수를 저장할 배열을 만들 때, 따로 변수선언을 안하고 3점갯수, 2점갯수, 총점을 저장할 배열을 추가로 만들어 주었고, 

입력받는 동시에 각각을 계산해 주었다. 


입력이 끝난 후에는 1. 1~3이 유일하게 가장 클 경우 (가장 간단)

   2. 두가지 이상이 동일할 경우 

두가지로 나누어서 1번의 경우에는 간단히 출력하였고, 2번의 경우에는 3의 갯수와 2의 갯수를 확인하여 출력하였다. 

더 짧게도 가능할 것 같은데 너무 의식의 흐름대로 푼 것 같기도 하다..