본문으로 바로가기


문제 풀이 >>




다트 판의 점수는 총 20 점 까지 이고 한칸당 18도씩 차지하고 있다.  주어지는 x, y좌표의 atan( 역 탄젠트 ) 를 이용해서 각도를 구해서 어느 점수인지 확인 할 수 있다. c언어에서 atan는 라디안 으로 주어지기 때문에 degree로 다시 바꿔서 하는게 편하다. 



주의할 점은 6점과 11점이 좌표 0에서 시작하는게 아니기 때문에 구한 각도에 +9를 해서 구해야 한다. 



나는 atan2함수를 사용했고 atan2함수는 atan2( y, x )를 해서 사용할 수 있다. 값은 3, 4분면의 좌표값들은 -각도로 나오기 때문에 그것도 고려해주어야 한다. 


문제만 이해된다면 쉽게 작성할 수 있는 문제다. 



코드 >>


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
#include <stdio.h>
#include <math.h>
int Answer;
 
int main(void)
{
    int T, test_case;
    setbuf(stdout, NULL);
 
    scanf("%d"&T);
    for(test_case = 0; test_case < T; test_case++)
    {
        int score[11= {6,13,4,18,1,20,5,12,9,14,11};
        int score2[11= {6,10,15,2,17,3,19,7,16,8,11};
        int A,B,C,D,E;
        int N;
        int x,y;
        
        double degree;
        double dist;
        Answer = 0;
        
        scanf("%d %d %d %d %d"&A, &B, &C, &D, &E);
        scanf("%d"&N);
        
        int i;
        for(i=0; i<N; i++){
            scanf("%d %d"&x, &y);
            dist = sqrt((x*x)+(y*y));
            
            if(dist < A){
                Answer += 50;
            }
            else{
                degree = atan2(y, x);
                degree = (degree*180)/3.141592;
                
                if(degree<0){
                    degree = -degree + 9;
                    
                    if(B < dist && dist < C){
                        Answer += 3*score2[(int)(degree/18)];
                    }
                    
                    else if(D < dist && dist < E){
                        Answer += 2*score2[(int)(degree/18)];
                    }
                    
                    else if(E < dist){
                        Answer += 0;
                    }
                    else{
                        Answer += score2[(int)(degree/18)];
                    }
                }
                else{
                    degree += 9;
                    
                    if(B < dist && dist < C){
                        Answer += 3*score[(int)(degree/18)];
                    }
                    else if(D < dist && dist < E){
                        Answer += 2*score[(int)(degree/18)];
                    }
                    else if(E < dist){
                        Answer += 0;
                    }
                    else{
                        Answer += score[(int)(degree/18)];
                    }
                }
            }
        }
        
        printf("Case #%d\n", test_case+1);
        printf("%d\n", Answer);
        
    }
 
    return 0;//Your program should return 0 on normal termination.
}
cs


원래 배열 하나에 점수를 다 넣으려고 했는데 음수 양수를 나눠서 하는게 편해서 2개로 나눠서 했다.