[프로그래머스] 점찍기

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);