2023. 4. 7. 21:41ㆍ알고리즘
프로그래머스 문제
좌표평면을 좋아하는 진수는 x축과 y축이 직교하는 2차원 좌표평면에 점을 찍으면서 놀고 있습니다.
- 원점(0, 0)으로부터 x축 방향으로 a*k(a = 0, 1, 2, 3 ...), y축 방향으로 b*k(b = 0, 1, 2, 3 ...)만큼 떨어진 위치에 점을 찍습니다.
- 원점과 거리가 d를 넘는 위치에는 점을 찍지 않습니다.
정수 k와 원점과의 거리를 나타내는 정수 d가 주어졌을 때, 점이 총 몇 개 찍히는지 return 하는 solution 함수를 완성하세요.
제한사항
- 1 ≤ k ≤ 1,000,000
- 1 ≤ d ≤ 1,000,000
이 문제를 풀기 위해서 원 내부 점이 몇개인지 세도록 구현하였습니다.
a^2 + b^2 <= r^2 이 원 내부를 가리키는 것을 이용하면 생각보다 쉽게 풀 수 있었습니다.
다만, long타입인 answer에 아래와 같은 수식을 더해줬는데 에러가 발생했습니다.(아마 테스트 11,13,14번 실패였던 것 같습니다.)
answer += Math.sqrt(distance - a*a) + 1;
한참을 헤매다 캐스팅을 명시해주니 정상 동작하였습니다.
answer += (long)Math.sqrt(distance - a*a) + 1;
처음에는 캐스팅이 원인인지 모르고 아래와 같이 풀었습니다.
answer += Math.floor(Math.sqrt(distance - a*a)) + 1;
혹시나 해서 넣었는데 동작했고, 그냥 넘어갈까 하다가 성격상 이해못하고 넘어가기 싫어서 계속 파보았습니다.
그렇게 검색도 해보고 시도도 여럿 해보면서 타입 캐스팅을 명시했을 때 정상 동작하는 것을 보고, 명시해주지 않을 때는 연산이 달라지는 것 같습니다. 해당 테스트 케이스가 어떤 상황인지 알 수 없으니 더 알 수가 없어 슬픕니다. 캐스팅은 항상 명시해주자라고 생각하며 문제를 마무리했습니다.
+ 추가로 캐스팅에 대한 실수가 한가지 더 있었습니다.
long distance = (long)(d*d) / (k*k);
이렇게 했더니 3개 빼고 전부 오류가 떴습니다.
고민해보니 제곱연산할때 이미 int 타입 범위를 넘어간것 같아 연산하기 전에 바꿔서 해결했습니다.
long distance = ((long)d*d) / ((long)k*k);