프로그래머스 : 점 찍기 (Java)
문제
링크 확인
풀이
입력되는 정수 k, d에 대하여 조건을 만족하는 (x, y) 좌표를 찾아야 한다.
문제에서 조건은 다음과 같다.
- 원점(0, 0)과의 거리가
d
를 넘지 않아야 한다.
- 좌표의 x, y 값은 k의 배수이다.
기본적으로 원점과 x=0
일 때 y
좌표값, y=0
일 때 x
좌표값들의 개수를 추가해둔다.
코드로 나타내면 아래와 같다.
long answer = 1; // 원점 1개
// d : 최대 거리
// d를 k로 나눈 값에 2를 곱해주면,
// x=0 일 때, y=0 일 때의 좌표값들의 개수이다.
answer += ((d / k) * 2);
이제 x, y가 0이 아닐 때 좌표 조합을 구해야 한다.
(x, y) 좌표와 원점과의 거리가 d
를 넘지 않아야 하므로 거리 구하는 공식을 이용하여 d^2 >= x^2 + y^2
을 만족하는 x, y 조합을 찾아야 한다.
x
나 y
중 하나를 기준으로 좌표 값을 증가시켜가면서 최대거리 d
가 되는 나머지 좌표값을 구하고, 이를 k
로 나눠주면 최대거리 d
를 넘지 않는 기준 좌표의 짝 좌표값 개수를 알 수 있다.
이 짝 좌표값들은 0을 포함하지 않는다.
코드
Java로 작성한 전체 코드는 다음과 같다.
class Solution {
public long solution(int k, int d) {
long answer = 1;
answer += ((d / k) * 2);
double pow = Math.pow(d, 2);
for (int i = 1; i * k <= d; i++) {
int num = i * k;
answer += (int) Math.sqrt(pow - Math.pow(num, 2)) / k;
}
return answer;
}
}