설모의 기록

[codeground 연습문제 4] 다트게임 본문

알고리즘

[codeground 연습문제 4] 다트게임

HA_Kwon 2018. 4. 10. 21:59

 이 문제는 다트게임에서 얻는 점수를 출력하는 게임입니다. 라디안 각도가 헷갈려서 연습문제 1~4번 문제 중 가장 많이 헤맨 문제입니다. 

 먼저 점수를 다르게 받을 수 있는 구역에 대한 반지름 5개가 주어지고, 대희가 다트를 쏜 개수가 주어지며 그 다음부터 쏜 다트의 (x, y) 좌표가 주어집니다. 

 우선 다트판이 20개 칸으로 나누어져있고, 반 개의 칸만큼 회전되어 있으므로 저는 다시 반 개의 칸만큼 회전시켜야 된다고 생각했습니다. 그래서 시계방향으로 회전해서 0~(360/20) 의 점수가 13이라 하고, 대희가 쏜 다트의 각도도 각각 -9만큼 회전시켰습니다.

 주어진 (x, y) 를 피타고라스 정리를 이용해 원점으로부터의 반지름(대각선)의 길이를 구할 수 있습니다. 이 반지름( Math.sqrt(x*x + y*y) ) 을 이용해 그 다트가 받을 수 있는 보너스 점수를 알아냅니다. 

 그 다음 이용할 함수가 바로 Math.atan2(double y, double x) 인데요. 저도 이 함수가 반환하는 값이 헷갈렸어요ㅠㅠ.. 우선 atan은 radian 각도를 반환해줍니다. Math.atan() 은 [0 ~ Math.PI] 를 반환해주고 Math.atan2() 는 [-Math.PI ~ Math.PI] 구간을 반환해줍니다. 저는 360를 이용할 것이기 때문에 atan2 함수를 골랐습니다.

 위의 이미지는 Math.atan() 이 각도마다 반환하는 값입니다. 180도 부터 360도 까지가 [-Math.PI ~ -0] 임을 주의해주세요! 따라서 radian 값이 0보다 작으면 360씩 더해 [180 ~ 360] 구간으로 만들어 줍니다. 그 다음 다트판을 시계방향으로 9도씩 회전했으므로 radian 값도 -9씩 더해줍니다.  하지만 예외가 있습니다. 예를 들어, 원래 5도였다면 -9를 하면 -4도가 되어 음수가 발생합니다. 이것을 방지하기 위해 모든 각도에 360을 더한 후 360으로 나눈 값의 나머지를 radian 에 넣어줬습니다. 최종적으로 radian 을 18(=360 / 20) 으로 나눈 인덱스의 점수를 multiple 변수를 곱해 Answer에 저장하면 됩니다.


Comments