티스토리 뷰

알고리즘/백준

-숫자 게임(2303)-

로또_ 2019. 9. 10. 01:34

문제 : https://www.acmicpc.net/problem/2303

 

2303번: 숫자 게임

N명이 모여 숫자 게임을 하고자 한다. 각 사람에게는 1부터 10사이의 수가 적혀진 다섯 장의 카드가 주어진다. 그 중 세 장의 카드를 골라 합을 구한 후 일의 자리 수가 가장 큰 사람이 게임을 이기게 된다. 세 장의 카드가 (7, 8, 10)인 경우에는 합은 7+8+10 = 25가 되고 일의 자리 수는 5가 된다. 어떤 사람이 받은 카드가 (7, 5, 5, 4, 9)인 경우 (7, 4, 9)를 선택하면 합이 20이 되어 일의 자리 수는 0이 되고, (5

www.acmicpc.net

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
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <utility>
using namespace std;
 
int n;
int myfivecards[5];
vector<pair<pair<intint>int>> scoreboard;
 
void receiveCards() {
    for(int mycard = 0; mycard < 5; mycard++) {
        cin >> myfivecards[mycard];
    }
    return;
}
 
int find_Firstbiggestnumber(int orderofperson) {
    int sum = 0;
    int maxsum = 0;
    int one = 0;
    int maxone = 0;
 
    for(int firstCard = 0; firstCard < 3; firstCard++) {
        for(int secondCard = firstCard+1; secondCard < 4; secondCard++) {
            for(int lastCard = secondCard+1; lastCard < 5; lastCard++) {
                sum = myfivecards[firstCard] + myfivecards[secondCard] + myfivecards[lastCard];
                one = sum%10;
                
                if(one > maxone) {
                    maxone = one;
                    maxsum = sum;
                }
            }
        }
    }
    scoreboard.push_back(make_pair(make_pair(maxone, orderofperson), maxsum));
}
 
void scoreboardSorting() {
    sort(scoreboard.begin(), scoreboard.end());
}
 
int main() {
    cin >> n;
 
    for(int player = 1; player <= n; player++) {
        receiveCards();
        find_Firstbiggestnumber(player);
    }
    scoreboardSorting();
    cout << scoreboard[n-1].first.second << endl;
}
 
 

3중 for문을 돌때, 무작위로 3개의 카드를 뽑는 것이다.

순서있게 나열하였을때 다음카드는 현재카드의 +1 의 위치이다.

위 규칙은 어떤 순서의 카드를 뽑을때도 적용이 된다.

 

c언어의 struct 구조를 사용하면 어떨까 생각했다.

pair안 에 pair가 있는 구조는 너무 직관적이지도 않고, 복잡하다.

 

일의자리의 숫자만 뽑을때 나눗셈을 사용하자

tostring해서 변환 후, 어려 공정을 거치는 방법은 너무 과정이 길고 비효율적이다.


 

처음엔 내가 하는 풀이 방식이 잘못됬다고 생각하서 중간에 작성을 그만두고 다른방법이 있을까 생각해보았다.

하지만 다른 방법이 생각나지 않아서 원래의 생각했던 데로 작성하였다.

이번 문제는 같은 숫자가 있을 경우 합이 더 큰 사람이 나오게 되있었다.

이같은 문제를 pair로 쉽게 해결 할 수 있었다.

//pair는 다른상황이 주어지지 않을 경우 첫번째 인자로 sort하고, 만약 같은 것이 있으면 두번째 인자로 정렬한다.

 

요즘에 변수명 정하는데 직관적이고 이해하기 쉽게하고 있다.

안해던짓을 해서 그런지 너무 생각이 많다. 뭐로 정해야할지

 

지난 문제가 내 자신감을 많이 낮추었지만 조금씩 회복하는 중이다..

반응형