169198. 당구 연습 / c++ / level2 / 1시간 10분
문제 및 코드
접근 방식
좌표계
- 한참을 각도에 대해 상각하다 문득 종이접기처럼 좌표를 접어볼 생각을 했다.
- 입사각과 반사각이 똑같이 때문에 당구대의 한 변을 기준으로 목표 공의 좌표를 접어봤다.
- 10 x 10 크기의 당구대에서 {3,7} 좌표에 있는 공의 경우 X = 0 (Y축) 기준으로 접게 되면
{-3, 7} 이 된다.
- 목표 공의 접은 좌표와 시작 공 좌표에 대한 거리의 제곱이 구하고자 하는 값이었고, 두 점사이의 거리를 구하는 공식이 애초에 루트를 씌워야했으므로 그걸 빼주면 DeltaX2 + DeltaY2 가 최종 공식이었다.
- 당구대의 총 변은 4개이고 각각에 대한 접은 좌표를 4개 구해서 그 중 최소값을 출력해주면 되는 문제였다.
- 이 때, 쿠션을 튕기지 않고 목표 공과 만나는 경우는 예외처리가 필요했다.
(ex. 두 좌표의 X값이 같은데, 시작 공의 X좌표보다 목표 공의 X 좌표가 작은 경우, X = 0 변에 닿기 전에 만나버리게 된다.)
- 모서리에 맞춰서 튕기면, 해당 모서리와 닿아있는 2변을 기준으로 접어주면 좌표가 나오게 되는데, 어떻게 해도 한 변을 기준으로 접은 것보다 멀어지게 되므로 대상에서 제외했다.
다시 생각해 볼 점
- 수학에 관련된건 약점이라고 생각했고, 특히나 좌표와 기하학 쪽은 더 어려워했었는데, 원리적으로 접근하려고 노력했고, 시간이 많이 걸렸지만 스스로 풀어낼 수 있었다.
- 항상 코테 문제를 풀 때 코드부터 적으려 했는데, 그림을 그려서 원리를 먼저 찾아내는 것이 훨씬 효율적이라는 것을 깨달았다.