9553 양궁

1499 단어 baekjoonbaekjoon

수학을 안 한지 오래되어서 처음엔 다소 당황스러웠지만, 천천히 고민해보니 그냥 (1)각 타겟의 양 끝에 해당하는 범위를 (2)확률로 환산하여 (3)다 더해주면 된다는 것을 짐작할 수 있었다.


처음엔 아크탄젠트로 접근했다. 수학이 오랜만이라 뭐가 더 효율적인지는 모르겠고 기억나는 각 구하는 방법이 이것밖에 없었다...😭

하지만, zeroDivision 등등 고려해야할게 많은 것 같아 아크코사인으로 갈아탔다. 삼각형의 세 변 a, b, c를 이용해서 a, b의 사잇각을 구하는 공식을 사용했다. 이것밖에 생각나는게 없었다...😭 예제가 맞게 잘 돌아가서 제출했으나 런타임에러(ValueError)!! 도대체가 이해가 안 가서 ValueError가 나는 원인을 찾아다녔지만 그냥 내 코드에 빈틈이 있는 걸로 판정이 났다. 이 코드의 경우에는 방향성을 고려하지 않았기때문에 θ와 θ+2π의 구분이 없었던 것 같다..

마지막으로 벡터의 내적을 이용해서 사잇각을 구하는 방식으로 문제를 해결했다.

타겟이 원점을 지날경우는 제외해주어야 한다.

import math
exp = 0.000000
T = int(input())
for i in range(T):
    N = int(input())
    for j in range(N):
        X1, Y1, X2, Y2 = map(int, input().split())
        if (X1 == -X2 and Y1 == -Y2) or (X1 == 0 and Y1 == 0) or (X2 == 0 and Y2 == 0):
            break
        else:
            exp += math.acos((X1*X2 + Y1*Y2)/math.sqrt((X1*X1 + Y1*Y1)*(X2*X2 + Y2*Y2)))
    print("{:.5f}".format(round(exp/(math.pi*2), 5)))
    exp = 0.00000

계산법은 기억이 나지않아(수학 어쩌지...) 아래 사이트를 참고했다.

https://www.mathway.com/ko/popular-problems/Trigonometry/392481

좋은 웹페이지 즐겨찾기