728x90
이해하기
첫 접근방식은 다음과 같았다.
- x축을 0으로 놓고 가능한 y 좌표값을 구한다.
- y축을 0으로 놓고 가능한 x 좌표값을 구한다.
- x, y축을 이동시켜가며 서로의 좌표값을 구한다.
- 구한 좌표값들은 중복되지 않도록 set에 저장한다.
하지만 구현하다보니 뭔가 잘못되었다는 것을 직감했다...
내가 짠 코드대로라면 x가 0일 때, y가 0일때, x가 k일 때, y가 k일 때의 경우만 구해지는 것이다.
k의 배수이고 d보다 작거나 같을 때를 구해야 하는 것인데...!
결국 오늘도 구글링🥹
처음 참고한 글은 요기⬇️
이 분의 접근 방식은 다음과 같았다.
- 반지름이 d인 원 내부에서 1사분면에 해당하는 점의 개수를 구하는 문제
- 좌표평면 위의 원에 x = k라는 직선을 그어서 만나는 점(정수) 밑으로 k만큼 거리를 둔 점이 몇 개 찍히는지 구하기
- 제곱근 구할 때 long으로 형변환할 것
원을 그릴 생각은 못했는데 아차 싶었다.
두번째 참고한 글은 요기⬇️
이 글에서는 위와 같은 방식을 좀 더 자세하게 설명하였다.
- 각 x좌표에 대해 최대 y좌표값을 구한다.
- 최대 y를 maxY라고 지칭하면 피타고라스 정리에 의해 다음과 같은 식이 나온다.
- x ^ 2 + maxY ^ 2 = d ^ 2
- maxY = Math.sqrt(d * d - x * x)
- 이렇게 구한 maxY를 k로 나눈 뒤 1을 더한다.
- 이때 1은 (x, 0)도 포함시키기 위해서 더해주는 것이다.
문제풀이
class Solution {
public long solution(int k, int d) {
long answer = 0;
for (long x = 0; x <= d; x += k) {
long maxY = (long) Math.sqrt((long)d * d - (long)x * x);
answer += maxY / k + 1;
}
return answer;
}
}
생각보다 수학적으로 접근하면 쉽게풀리는 문제였다.
한 가지 주의할 점은 위에서 말했듯이 제곱근 구할 때 long으로 형변환할 것이었다.
이 부분을 빼먹어서 실패가 계속 떴었다.
'JAVA > Coding Test Study' 카테고리의 다른 글
[Lv.3] 입국심사 : Java (0) | 2024.04.05 |
---|---|
[Lv.3] 징검다리 건너기 : Java (0) | 2024.04.05 |
[Lv.2] 시소 짝꿍 : Java (0) | 2024.04.03 |
[Lv.3] 불량 사용자 : Java (0) | 2024.04.02 |
[Lv.2] 소수 찾기 : Java (0) | 2024.04.02 |