백준 2621번 - 카드게임

2020. 12. 27. 21:40· Koala - 1기

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, 0, sizeof(col));
    memset(number, 0, sizeof(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);
}
Colored by Color Scripter
cs

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

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

'Koala - 1기' 카테고리의 다른 글

백준 17134번 - 르모앙의 추측  (0) 2020.12.27
백준 2150번 - Strongly Connected Component  (0) 2020.12.27
백준 1197번 - 최소 스패닝 트리  (0) 2020.12.27
스터디 세부 계획  (0) 2020.08.16
소모임 소개글  (0) 2020.08.14
'Koala - 1기' 카테고리의 다른 글
  • 백준 2150번 - Strongly Connected Component
  • 백준 1197번 - 최소 스패닝 트리
  • 스터디 세부 계획
  • 소모임 소개글
KauKoala
KauKoala
항공대 알고리즘 동아리 Koala 🥰
KauKoala
Koala
KauKoala
전체
오늘
어제
  • 분류 전체보기 (1889)
    • 공지 게시판 (10)
    • 정보 게시판 (8)
    • Codeforce (15)
    • acm-icpc (6)
    • Koala - 1기 (16)
    • Koala - 2기 (111)
      • Programming Contest (1)
      • A반 (20)
      • B반 (39)
      • C반 (22)
      • 기초 강의 (18)
    • Koala - 3기 (10)
      • 기초 스터디 (7)
    • Koala - 4기 (67)
    • Koala - 5기 (144)
      • 기초 알고리즘 스터디 (75)
      • 코딩테스트 준비 스터디 (68)
    • Koala - 6기 (102)
      • 기초 알고리즘 스터디 (75)
      • 코딩테스트 준비 스터디 (25)
      • 모의 테스트 스터디 (1)
    • Koala - 7기 (167)
      • 기초 알고리즘 스터디 (97)
      • 코딩테스트 준비 스터디 (68)
      • 모의 테스트 스터디 (1)
    • Koala - 8기 (44)
      • 기초 알고리즘 스터디 (32)
      • 코딩테스트 준비 스터디 (10)
      • 코드포스 버츄얼 스터디 (0)
      • 프로그래머스 LV2 스터디 (0)
    • Koala - 9기 (205)
      • 기초 알고리즘 스터디 (138)
      • 코딩테스트 준비 스터디 (64)
      • 모의테스트 준비 스터디 (1)
    • Koala - 10기 (117)
      • 기초 알고리즘 스터디 (30)
      • 코딩테스트 준비 스터디 (86)
      • 모의테스트 준비 스터디 (1)
    • Koala - 11기 (151)
      • 기초 알고리즘 스터디 (46)
      • 코딩테스트 준비 스터디 (104)
      • 모의테스트 준비 스터디 (1)
    • Koala - 12기 (86)
      • 기초 알고리즘 스터디 (31)
      • 코딩테스트 준비 스터디 (55)
    • Koala - 13기 (119)
      • 기초 알고리즘 스터디 (52)
      • 코딩테스트 준비 스터디 (67)
    • Koala - 14기 (116)
      • 기초 알고리즘 스터디 (39)
      • 코딩테스트 준비 스터디 (77)
    • Koala - 15기 (138)
      • 기초 알고리즘 스터디 (73)
      • 코딩테스트 준비 스터디 (65)
    • Koala - 16기 (47)
      • 코딩테스트 기초 스터디 (16)
      • 코딩테스트 심화 스터디 (31)
    • Koala - 17기 (62)
      • 코딩테스트 기초 스터디 (15)
      • 코딩테스트 심화 스터디 (47)
    • Koala - 18기 (31)
      • 코딩테스트 기초 스터디 (11)
      • 코딩테스트 심화 스터디 (20)
    • Koala - 19기 (43)
      • 코딩테스트 기초 스터디 (7)
      • 코딩테스트 심화 스터디 (36)
    • Koala - 20기 (0)
      • 코딩테스트 기초 스터디 (0)
      • 코딩테스트 심화 스터디 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 🐨항공대 알고리즘 학회 Koala 3기 모집
  • 🐨항공대 알고리즘 학회 Koala 2기 모집
  • 소모임 소개

인기 글

태그

  • dp
  • 백트래킹
  • dfs
  • BOJ
  • 백준
  • BFS
  • C++
  • 파이썬

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.3.0
KauKoala
백준 2621번 - 카드게임
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.