<링크>

https://www.acmicpc.net/problem/2621 


<소스코드>

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
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int main() {
    int ans = 0;
 
    vector<pair<int,char>> card;
    int cnt[10= { 0, };
    string buf;
    int maxNum = 0;
    for (int i = 0; i < 5++i)
    {
        getline(cin, buf);
        char c = buf[0];
        int n = buf[2- '0';
        card.push_back({ n,c}); //숫자, 색깔
        maxNum = max(maxNum,n);
        cnt[n]++;
    }
 
 
 
    int colorCheck = 1;
    int seqCheck = 1;
    sort(card.begin(), card.end());
    char c = card[0].second;
    for (int i = 1; i < 5++i)
    {
        if (c != card[i].second)
            colorCheck = 0;
        if (card[i].first != card[i - 1].first + 1)
            seqCheck = 0;
    }
    if (colorCheck)
        ans = max(ans, 600 + maxNum);
    if (seqCheck)
        ans = max(ans, 500 + maxNum);
    if (colorCheck && seqCheck)
        ans = max(ans, 900 + maxNum);
 
    vector<pair<intint>> v;
    for (int i = 1; i <= 9++i)
        if (cnt[i])
            v.push_back({cnt[i],i });
    sort(v.begin(), v.end(),greater<pair<int,int>>());
    
    if (v[0].first >= 4)
        ans = max(ans,v[0].second + 800);
    else if (v[0].first == 3)
    {
        if (v[1].first == 2)
            ans = max(ans,v[0].second * 10 + v[1].second + 700);
        else
            ans = max(ans,v[0].second + 400);
    }
    else if (v[0].first == 2)
    {
        if (v[1].first == 2)
        {
            int m = max(v[0].second, v[1].second);
            int n = min(v[0].second, v[1].second);
            ans = max(ans,m * 10 + n + 300);
 
        }
        else
            ans = max(ans,v[0].second + 200);
    }
    else
        ans = max(ans,maxNum + 100);
    
    printf("%d", ans);
 
}
cs


<풀이>

걍 조건문 잘 만드는 문제인데 낚시가 있을것같았다. 

예를들어 R5, Y5, G7, B5, Y7 일때, 

같은숫자가 3개&2개인데 2개&2개도 적용이 된다. 

상식상 카드게임할때 3&2가 2&2보다 더 운좋은거니까 높은점수를 먹을것같았는데

2개&2개로 계산하는게 10을 곱하고 어쩌고가 있어서 더 클수도있을것같았다.

그래서 규칙들을 적용했을 때 나올수 있는 점수 범위를 보니까

<규칙 : 나올수있는점수>

●9번규칙 : 101~109점 ●8번규칙(2) : 201~209점 ●7번규칙(2&2) : 311~399점 ●6번규칙(3) : 401~409점 ●3번규칙(3&2) : 711~799점 ●2번규칙(4) : 801~809점

하위규칙에서 아무리 잘나와봤자 상위규칙의 제일 못한놈을 이길수는 없다.

그래서 규칙적용 순서만 잘 적용시키면 최대점수를 알수있게 된다.


<카드 숫자 빈도 : 규칙>

●5 : 2번규칙 ●4 1 : 2번규칙 ●3 2 : 3번규칙 ●3 1 1 : 6번규칙 ●2 2 1 : 7번규칙 ●2 1 1 1 : 8번규칙 ●1 1 1 1 1 : (1 or 4 or 5 or 9번규칙)

'알고리즘 풀이 > 기타' 카테고리의 다른 글

백준 1991 트리 순회  (0) 2018.08.31
백준 8979 올림픽  (0) 2018.08.29
백준 13414 수강신청  (0) 2018.08.02
백준 13413 오셀로 재배치  (0) 2018.08.01
백준 10973 이전 순열  (0) 2018.07.24

+ Recent posts