티스토리 뷰

반응형

다트게임

난이도 : 5/10

어렵다. 구현이라는게 생각보다 어렵다. 어떨 땐 기초 BFS, DFS, dp 등의 문제가 쉽다 ... 가끔은 그렇다. (-.-....)... 

아래 시계문제를 포스팅해서 갑자기 기억나서 또 비슷한 원문제를 포스팅했다.


내용보기

https://www.codeground.org/practice/practiceProblemView


설명

흠... 두가지가 중요하다.

1 <math.h> 에 선언된 atan2 함수의 사용

atan2 는 c에서 지원하는 (gcc에서는 -lm 옵션을 붙여야함) 함수이다. 

atan2 에 대한설명보기


360도를 표현하려면 " atan(y,x) * 360 / PI  "를 사용하여야한다.
y축이 음수일 땐 각도가 음수이므로, 일정한 각도를 더해줘서 사용하던가 해야한다. 이 부분은 다음 2 번에서 확인해보자.

2 점수 배열 생성과 각도를 점수 배열 index로의 치환

각도는 구했는데 dart의 inex와 어떻게 접합시키는지가 관건이다.
실제로 x=5, y=5 일 때 "atan(5,5) *360 / 3.141592... " 를 수행했을 때 45가 나온다. 
점수 배열로의 치환 또는 점수배열의 생성은 어찌보면 각도가 음수일 때 어떻게 처리해줘야하는 문제와 겹친다.

음... 
머리가 더 아프군.

처음에 배열을 0을 20, 1을 1 ... 이렇게 {20, 1, 18, 4, 13, 6,10, 15 ... } 시계방향으로 생성했었는데 인덱스 처리라던가 음수 처리가 굉장히 머리가 아팠다.
이럴바엔 각도 자체가 반시계 방향처럼 동작하므로 반시계방향으로 배열을 생성하는것이 낫다. 그것도 진짜 각도가 0도인 6 부터. 즉, {6, 13, 4, 18, 1, 20, 5, 12, 9, 14 ... } 이렇게 반시계방향으로 생성하는것이 편하였다.
이렇게 한다면 음수가 나오는 각도를 360도를 더함으로써 처리할 수 있다. 


정답보기

https://github.com/ingyeoking13/algorithm/blob/master/cg/p4dart.c

반응형

'알고리즘 문제 > implementation' 카테고리의 다른 글

879B: Table Tennis  (0) 2017.10.27
879A : Borya's Diagnosis  (0) 2017.10.27
868B : Race Against Time  (0) 2017.10.08
p868a : Bark to Unlock  (0) 2017.10.08
Codeforces: Between The Offices  (0) 2017.10.02