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/
'코테 문제 풀이 > 온코더 oncoder' 카테고리의 다른 글
온코더 레벨 15 원형 배치 (0) | 2020.11.30 |
---|---|
온코더 레벨 13 수열 중복 제거 (0) | 2020.11.25 |
온코더 레벨 11 잔액 계산 (0) | 2020.11.25 |
온코더 레벨 10 평형점 구하기 (0) | 2020.11.25 |
온코더 레벨 9 스택 만들기 (0) | 2020.11.25 |