2016/01/31 코드 그라운드 문제 : 다트 게임
https://www.codeground.org/practice/practiceProbView.do?probId=4
다트판은 원형이고 총 20개의 점수가 균등한 칸으로 나누어져 있다. 생각해야 할 점은 크게 두가지다.
1. 거리에 따라 점수가 1,2,3배 혹은 0점이나 50점으로 된 다는 것.
2. 좌표를 입력받은 뒤 원형 좌표계에서 (x,y)는 (r cosθ , r sinθ)에 대응한다는 점을 이용해서 θ가 포함되는 범위를 계산해 대응하는 점수표를 찾는다. 나는 cos함수를 이용해서 sin이 음수냐 양수이냐에 따라 구분해줬는데 tan함수를 이용하면 2π범위에서 겹치지 않으니까 발산하는 경우만 잘 고려해주면 될 것 같기도 하다.
다트판은 원형이고 총 20개의 점수가 균등한 칸으로 나누어져 있다. 생각해야 할 점은 크게 두가지다.
1. 거리에 따라 점수가 1,2,3배 혹은 0점이나 50점으로 된 다는 것.
2. 좌표를 입력받은 뒤 원형 좌표계에서 (x,y)는 (r cosθ , r sinθ)에 대응한다는 점을 이용해서 θ가 포함되는 범위를 계산해 대응하는 점수표를 찾는다. 나는 cos함수를 이용해서 sin이 음수냐 양수이냐에 따라 구분해줬는데 tan함수를 이용하면 2π범위에서 겹치지 않으니까 발산하는 경우만 잘 고려해주면 될 것 같기도 하다.
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
95
96
97
98
99
100
101
102
103
104
105
106
107
|
// 아래 기본 제공된 코드를 수정 또는 삭제하고 본인이 코드를 사용하셔도 됩니다.
#include <stdio.h>
#include <math.h>
int A, B, C, D, E;
int point[2][11];//룰의 행과 열에 대응하는 점수
//double rule[2][11];
double rule[11];//y가 양수, 음수, 0일때는 양수로쳐도 됨, point를 구하기 위한 룰
void setDartboard() {
point[0][0] = 6;
point[0][1] = 13;
point[0][2] = 4;
point[0][3] = 18;
point[0][4] = 1;
point[0][5] = 20;
point[0][6] = 5;
point[0][7] = 12;
point[0][8] = 9;
point[0][9] = 14;
point[0][10] = 11;
point[1][0] = 11;
point[1][1] = 8;
point[1][2] = 16;
point[1][3] = 7;
point[1][4] = 19;
point[1][5] = 3;
point[1][6] = 17;
point[1][7] = 2;
point[1][8] = 15;
point[1][9] = 10;
point[1][10] = 6;
/*for (int i = 0; i < 10; i++)
rule[0][i] = sin((1 + 2 * i) / 20 * PI);
rule[0][10] = sin(PI);
for (int i = 0; i < 11; i++)
rule[1][i] = rule[0][10 - i];*/
double pi = 3.14159265358979323846;
for (int i = 0; i < 10; i++)
rule[i] = cos(pi/20*(1+2*i));
rule[10] = cos(pi);
}
int getpoint(double cos_theta, double y) {
int k = 0;
while (k<11 && rule[k]>cos_theta) //경계는 안 나온다고 했음
k++;
if (y >= 0) return point[0][k];
else return point[1][10 - k];
}
int score(double x, double y) {
int result = 0,point;
double dist;
dist = sqrt(pow(x,2)+pow(y,2));
point = getpoint(x / dist, y);
if (dist > E) {
result = 0 * point;
}
else if (dist >= D) {
result = 2 * point;
}
else if (dist > C) {
result = 1 * point;
}
else if (dist >= B) {
result = 3 * point;
}
else if (dist > A) {
result = 1 * point;
}
else {
result = 50;
}
return result;
}
int main(void) {
/* 아래 freopen 함수는 input.txt를 read only 형식으로 열고, 표준입력(키보드) 대신 input.txt 로 부터 읽어오겠다는 의미의 코드입니다.
만약 본인 PC 에서 테스트 할 때는, 입력값을 input.txt에 저장한 후 freopen 함수를 사용하면
그 아래에서 scanf 함수를 사용하여 표준입력 대신 input.txt 파일로 부터 입력값을 읽어 올 수 있습니다.
또한, 본인 PC에서 freopen 함수를 사용하지 않고 표준입력을 사용하여 테스트하셔도 무방합니다.
단, Codeground 시스템에서 "제출하기" 할 때에는 반드시 freopen 함수를 지우거나 주석(//) 처리 하셔야만 합니다. */
// freopen("input.txt", "r", stdin);
setbuf(stdout, NULL);
int TC;
int test_case;
int N,count,i;
double x, y;
setDartboard();
scanf("%d", &TC);
for (test_case = 1; test_case <= TC; test_case++) {
// 이 부분에서 알고리즘 프로그램을 작성하십시오. 기본 제공된 코드를 수정 또는 삭제하고 본인이 코드를 사용하셔도 됩니다.
count = 0;
scanf("%d %d %d %d %d", &A, &B, &C, &D, &E);
scanf("%d", &N);
for (i = 1; i <= N; i++) {
scanf("%lf %lf", &x, &y);
count = count + score(x, y);
}
// 이 부분에서 정답을 출력하십시오.
printf("Case #%d\n", test_case);
printf("%d\n", count);
}
return 0; // 정상종료 시 반드시 0을 리턴해야 합니다.
}
| cs |
댓글
댓글 쓰기