출처: https://school.programmers.co.kr/learn/courses/30/lessons/140107
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
❔ 문제
문제 설명
좌표평면을 좋아하는 진수는 x축과 y축이 직교하는 2차원 좌표평면에 점을 찍으면서 놀고 있습니다. 진수는 두 양의 정수 k, d가 주어질 때 다음과 같이 점을 찍으려 합니다.
- 원점(0, 0)으로부터 x축 방향으로 a*k(a = 0, 1, 2, 3 ...), y축 방향으로 b*k(b = 0, 1, 2, 3 ...)만큼 떨어진 위치에 점을 찍습니다.
- 원점과 거리가 d를 넘는 위치에는 점을 찍지 않습니다.
예를 들어, k가 2, d가 4인 경우에는 (0, 0), (0, 2), (0, 4), (2, 0), (2, 2), (4, 0) 위치에 점을 찍어 총 6개의 점을 찍습니다.
정수 k와 원점과의 거리를 나타내는 정수 d가 주어졌을 때, 점이 총 몇 개 찍히는지 return 하는 solution 함수를 완성하세요.
제한사항
- 1 ≤ k ≤ 1,000,000
- 1 ≤ d ≤ 1,000,000
입출력 예
🔍 풀이
접근 방법
k와 d의 범위가 최대 1,000,000 라서 이중 반복문을 사용하는 건 불가하다고 생각했고,
원점과 거리가 d를 넘는 위치에는 점을 찍지 않는다는 걸 보고 중심이 원점이고 반지름이 d인 원의 내부에 점이 찍히는 거라고 생각했습니다.
풀이
중심이 원점이고 반지름이 d인 원의 방정식은 x^2 + y^2 = d^2 입니다.
이 원의 내부에 있는 점을 구할 것이기 때문에 x^2 + y^2 <= d^2 를 만족하는 x, y 중 k의 배수를 구해야 합니다. 이 때의 x와 y를 반복문 하나만 사용해서 구하기 위해 x를 기준으로 방정식을 만들었습니다.
y = Math.sqrt(d^2 - x^2)
x는 0부터 k 씩 늘어나면서 d가 될 때까지 반복하고 방금 구한 x에 대한 방정식에 x를 대입해 y를 구합니다.
그 y 이하인 k 배수를 구하면 반지름이 d인 원의 내부에 찍힌 점의 개수를 구할 수 있습니다 (x >=0, y>=0 일 때!)
y 이하인 k 배수의 개수는 y/k 인데 0을 포함하기 때문에 y/k + 1 해줘야 합니다.
단, 주의해야 할 점은 k와 d가 최대 1,000,000 까지 가능하기 때문에 제곱을 구하면 int 형의 범위를 벗어납니다. 그래서 제곱을 구할 때도 d*d로 구하지 않고 Math.pow를 사용해야 합니다!
💡 소스코드
class Solution {
public long solution(int k, int d) {
long answer = 0;
for(int i=0; i<=d; i+=k){ // x
double y = Math.sqrt(Math.pow(d, 2) - Math.pow(i, 2));
answer += (long)(y/k) + 1;
}
return answer;
}
}
'Programming > Programmers' 카테고리의 다른 글
[프로그래머스] Lv2. 숫자 카드 나누기(Java) (0) | 2023.07.27 |
---|---|
[프로그래머스] Lv2. 호텔 대실 (Java) (0) | 2023.07.22 |
[프로그래머스] Lv2. 방금그곡 (Java) (0) | 2023.07.14 |
[프로그래머스] Lv2. 무인도 여행 (Java) (0) | 2023.07.14 |
[프로그래머스] Lv2. 두 큐 합 같게 만들기 (Java) (0) | 2023.07.13 |