코딩스토리

백준 2621번 - 카드게임 본문

알고리즘/BOJ 문제 풀이

백준 2621번 - 카드게임

kimtaehyun98 2020. 12. 27. 02:15

www.acmicpc.net/problem/2621

 

2621번: 카드게임

근우는 오늘 재미있는 카드 게임을 배우고 있다. 카드는 빨간색, 파란색, 노란색, 녹색의 네 가지 색이 있고, 색깔별로 1부터 9까지 숫자가 쓰여진 카드가 9장씩 있다. 카드는 모두 36(=4x9)장이다.

www.acmicpc.net

 

오늘 오후에 있을 C언어 실습 시험 대비로 한번 풀어봤다.

(아직도 시험 안 끝난 거 실화냐고!!!)

 

자바 수업시간에도 했던 거지만 c언어로 짜 보려고 봤는데 역시 이름답게 너무나도 더럽다.

솔직히 대충 조건문으로 때워서 아무생각없이 짤 수 있었는데

그러면 푸는 이유도 없고 도움도 안될 것 같아서 최대한 예쁘게? 짜 보려고 노력해봤다.

(나름 수업시간에 구조체를 배워서 구조체도 써봤다)

 

맨날 C++만 쓰다가 C를 쓰려니까 min, max함수 다 만들고 너무 귀찮다.. 

 

자세한 설명은 코드에 주석으로 달아놓았다. 

내 코드의 흐름은

1. 같은 그림이 몇 개씩 있는지 미리 구하기

2. 같은 숫자가 몇개씩 있는지, 그리고 그 숫자는 뭔지 미리 구하기

3. 조건에 맞게 점수 주기

 

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
#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)
 
int max(int x, int y) {
    if (x > y) return x;
    else return y;
}
 
int min(int x, int y) {
    if (x < y) return x;
    else return y;
}
 
typedef struct {
    char color;
    int num;
}card;
 
int main() {
    card arr[5];
    char trash[100];
    int col[4]; // 각 색깔이 몇 개씩 가지고 있는지
    int number[11]; // 각 숫자들을 몇개씩 가지고 있는지
    memset(col, 0sizeof(col));
    memset(number, 0sizeof(number));
    for (int i = 0; i < 5; i++) {
        scanf("%c %d"&arr[i].color, &arr[i].num);
        fgets(trash, 99, stdin); // 이거 안해주면 입력이 제대로 안됨..
        // RBYG
        if (arr[i].color == 'R') col[0]++;
        else if (arr[i].color == 'B') col[1]++;
        else if (arr[i].color == 'Y') col[2]++;
        else col[3]++;
        number[arr[i].num]++;
    }
    int ans;
    //색깔 겹치는게 몇개인지 구해놓기
    int c_one = 0, c_two = 0, c_three = 0, c_four = 0, c_five = 0;
    for (int i = 0; i < 4; i++) {
        if (col[i] == 1)c_one++;
        else if (col[i] == 2)c_two++;
        else if (col[i] == 3)c_three++;
        else if (col[i] == 4)c_four++;
        else if (col[i] == 5) c_five++;
    }
    // 연속적인 수가 있는지 구하기
    int yes = 0, max_num = -1;
    for (int i = 1; i <= 6; i++) {
        if (number[i] == 1 && number[i + 1== 1 && number[i + 2== 1 && number[i + 3== 1 && number[i + 4== 1) yes = 1;
    }
    // 같은 숫자들 미리 구하기
    int n_one = 0, n_two = 0, n_three = 0, n_four = 0, n_five = 0, i_four = 0, i_three = 0;
    int i_two[2];
    for (int i = 1; i <= 10; i++) {
        if (number[i] > 0) max_num = i;
        if (number[i] == 1)n_one++;
        else if (number[i] == 2) {
            n_two++;
            if (n_two == 1)i_two[0= i;
            else i_two[1= i;
        }
        else if (number[i] == 3) {
            n_three++;
            i_three = i;
        }
        else if (number[i] == 4) {
            n_four++;
            i_four = i;
        }
        else if (number[i] == 5) n_five++;
    }
 
    //카드 5장이 모두 같은 색이면서 숫자가 연속적일 때, 점수는 가장 높은 숫자에 900을 더한다. 예를 들어, 카드가 Y4, Y3, Y2, Y5, Y6 일 때 점수는 906(=6+900)점이다.
    if (c_five == 1 && yes == 1) ans = max_num + 900;
    //카드 5장 중 4장의 숫자가 같을 때 점수는 같은 숫자에 800을 더한다. 예를 들어, 카드가 B3, R3, B7, Y3, G3 일 때 점수는 803(=3+800)점이다.
    else if (n_four == 1) ans = 800 + i_four;
    //카드 5장 중 3장의 숫자가 같고 나머지 2장도 숫자가 같을 때 점수는 3장이 같은 숫자에 10을 곱하고 2장이 같은 숫자를 더한 다음 700을 더한다. 예를 들어, 카드가 R5, Y5, G7, B5, Y7 일 때 점수는 757(=5x10+7+700)점이다.
    else if (n_three == 1 && n_two == 1)  ans = (i_three * 10+ i_two[0+ 700;
    //5장의 카드 색깔이 모두 같을 때 점수는 가장 높은 숫자에 600을 더한다. 예를 들어, 카드가 Y3, Y4, Y8, Y6, Y7 일 때 점수는 608(=8+600)점이다.
    else if (c_five == 1) ans = max_num + 600;
    //카드 5장의 숫자가 연속적일 때 점수는 가장 높은 숫자에 500을 더한다. 예를 들어 R7, R8, G9, Y6, B5 일 때 점수는 509(=9+500)점이다.
    else if (yes == 1) ans = max_num + 500;
    //카드 5장 중 3장의 숫자가 같을 때 점수는 같은 숫자에 400을 더한다. 예를 들어 R7, Y7, R2, G7, R5 일 때 점수는 407(=7+400)점이다.
    else if (n_three == 1) ans = i_three + 400;
    //카드 5장 중 2장의 숫자가 같고 또 다른 2장의 숫자가 같을 때 점수는 같은 숫자 중 큰 숫자에 10을 곱하고 같은 숫자 중 작은 숫자를 더한 다음 300을 더한다. 예를 들어, R5, Y5, Y4, G9, B4 일 때 점수는 354(=5X10+4+300)점이다.
    else if (n_two == 2) ans = (max(i_two[0], i_two[1]) * 10+ min(i_two[0], i_two[1]) + 300;
    //카드 5장 중 2장의 숫자가 같을 때 점수는 같은 숫자에 200을 더한다. 예를 들어, R5, Y2, B5, B3, G4 일 때 점수는 205(=5+200)점이다.
    else if (n_two == 1) ans = i_two[0+ 200;
    //위의 어떤 경우에도 해당하지 않을 때 점수는 가장 큰 숫자에 100을 더한다. 예를 들어, R1, R2, B4, B8, Y5 일 때 점수는 108(=8+100)점이다.
    else ans = max_num + 100;
 
    printf("%d\n", ans);
}
cs

생각보다 코드가 긴데 주석 빼고 뭐 기타 등등 빼면 카드게임치곤 길지 않은 편 아닐까 싶다..

(그냥 조건문이 짧은게 좋아서 이렇게 짰어요)

Comments