오늘 오후에 있을 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);
}
|
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 |