W 개발 일지

온코더 레벨 14 레이저 발사 본문

Python/온코더 oncoder

온코더 레벨 14 레이저 발사

waVwe 2020. 11. 26. 22:33
반응형
from math import *
class Solution:
    def solution(self, x, y1, y2):
        self.a = x
        self.b = y1
        self.c = y2
        
        sum=0
        for i in range(len(self.a)):
            if(self.b[i]>self.c[i]):
                arg1 = self.b[i]
                arg2 = self.c[i]
            else :
                arg1 = self.c[i]
                arg2 = self.b[i]
            res = atan2(arg1,self.a[i])/pi
            res -= atan2(arg2,self.a[i])/pi
            sum += res
        return sum
cs

 

이 문제를 풀기 위해서는 atan2 함수와 라디안(호도법) 단위를 알아야 한다.

 

라디안 범위는 원에 반지름에 대한 호의 길이의 비이다.

𝝿 : 180도

2*𝝿 : 360도

𝝿/2 : 90도

 

 

atan과 atan2함수는 아크탄젠트 또는 역탄젠트로 좌표가 주어졌을 때 각도를 계산하는 함수이다.

atan(y/x)

atan2(y,x)

atan의 범위는 -𝝿/2 ~ 𝝿/2, atan2의 범위는 -𝝿 ~ 𝝿 이기 때문에 atan을 사용하면 1사분면에서의 좌표를, atan2을 사용하면 사분면 전체에서의 좌표로 각도를 계산할 수 있다.

 

 

예제 문제 3으로 풀어보자면,

x = [3,4,7,1]

y1 = [1,2,3,4]

y2 = [4,3,2,1]

리턴(정답): 0.4623163952488826

 

 

x[0] = 3일 때, y1[0] = 1, y2[0] = 4이다. 이를 사분면에 그려보면 위와 같다.

레이저는 (0.0)에서 발사되어 저 두 점 사이를 이은 선분에 닿아야 명중인 것이다. 

문제에서 레이저의 범위는 1사분면과 4사분면(" (0,0)을 기준으로 -π/2 는 아래로 수직을 의미하며, 0은 우측으로 수평, π/2는 위로 수직을 의미 합니다. ") 이므로 총 180도이다.

 

 

레이저는 저 삼각형 안에만 있다면 명중인 것이니, 노란 삼각형의 각도/180은 명중률이 된다.

그렇다면 (0.0) (3,0) (0.4)로 이루어진 삼각형의 각도를 구하고, (0.0) (3.0) (0.1)로 이루어진 삼각형의 각도를 구한 뒤

각각의 명중률을 구해 빼주면 오직 노란 삼각형 만의 명중률이 나온다.

이를 코드로 짜면 아래와 같다.

 

 
        sum=0
        for i in range(len(self.a)):
            if(self.b[i]>self.c[i]):
                arg1 = self.b[i]
                arg2 = self.c[i]
            else :
                arg1 = self.c[i]
                arg2 = self.b[i]
            res = atan2(arg1,self.a[i])/pi
            res -= atan2(arg2,self.a[i])/pi
            sum += res
        return sum
cs

 

 

atan2와 pi를 사용해야 하므로 당연히 from math import *도 맨 위에 써줘야 한다.

 

 

# atan2함수도, 라디안도 이 문제를 풀며 처음 안 만큼 오래 헤멘 문제였다 

 

 

 

 

출처 : www.oncoder.com/

반응형