[프로그래머스] 코딩테스트 연습 > 연습문제 > 점 찍기
좌표평면을 좋아하는 진수는 x축과 y축이 직교하는 2차원 좌표평면에 점을 찍으면서 놀고 있습니다. 진수는 두 양의 정수 k, d가 주어질 때 다음과 같이 점을 찍으려 합니다.
예를 들어, k가 2, d가 4인 경우에는 (0, 0), (0, 2), (0, 4), (2, 0), (2, 2), (4, 0) 위치에 점을 찍어 총 6개의 점을 찍습니다.
정수 k와 원점과의 거리를 나타내는 정수 d가 주어졌을 때, 점이 총 몇 개 찍히는지 return 하는 solution 함수를 완성하세요.
k | d | result |
---|---|---|
2 | 4 | 6 |
1 | 5 | 26 |
처음에 접근한 방식은
가능한 x, y 좌표값에 대해서, 원점과의 거리가 d보다 작은지를 확인하는 것이었다.
근데 시간초과 남
d값이 어마무시한데
이걸 이중 반복문을 도니까 시간초과가 났다,,,
이중 반복문을 피해야 한다.
일단 최대로 가질 수 있는 거리인 d 값은 정해져있다.
x값에 따른 최대 y값을 구한 뒤,
어차피 y는 k배 단위로 가질 수 있으니까 k로 나누어준다.
그러면 해결!
🔽 실패한 코드
class Solution {
public long solution(int k, int d) {
long answer = 0;
double x = 0, y = 0, distance;
for (long i = 0; i <= d; i++) {
for (long j = 0; j <= d; j++) {
x = i * k;
y = j * k;
distance = Math.sqrt(Math.pow(x,2) + Math.pow(y,2));
if (distance > d)
break;
answer++;
}
}
return answer;
}
}
class Solution {
public long solution(int k, int d) {
long answer = 0;
long maxy = 0; // 최대로 가질 수 있는 y
for (long x = 0; x <= d; x += k) {
// 좌표 x와 최대 거리 d에 대하여 최대로 가질 수 있는 y를 구한다.
maxy = (long) Math.sqrt(Math.pow(d, 2) - Math.pow(x, 2));
// k배 단위로 y값을 가질 수 있으므로 k로 나눈 뒤 1을 더한다.
answer += (maxy / k) + 1;
}
return answer;
}
}