원의 반지름과 중심의 x-y 좌표가 주어졌을 때, 원 내부에 균일하게 분포하는 랜덤한 점을 생성하는 randPoint() 함수를 작성해야 합니다. 구현 시 다음 사항들을 반드시 염두에 두어야 합니다.
- 입력값과 출력값은 모두 부동소수점(floating-point) 형태입니다.
- 원의 반지름과 중심 좌표는 클래스 생성자를 통해 전달됩니다.
- 원의 둘레(경계) 위에 있는 점도 원 안에 포함된 것으로 간주합니다.
randPoint()는 랜덤 점의 x좌표와 y좌표를 순서대로 반환합니다.
예를 들어 입력이 [10, 5, -7.5]라면, [11.15792, -8.54781], [2.49851, -16.27854], [11.16325, -12.45479]와 같은 랜덤 점들이 생성될 수 있습니다.
해결 접근 방법
이 문제를 해결하기 위해 다음 단계를 따릅니다.
uniform()메서드를 정의합니다. 이 메서드는 0 이상 1 미만의 균일한 난수를 반환하며,random_number / MAX_RANDOM방식으로 구현할 수 있습니다.- 생성자 초기화 리스트를 통해 반지름(rad)과 중심 좌표를 초기화합니다.
randPoint()는 다음과 같이 동작합니다.- theta = 2 × π × uniform() 으로 각도를 계산합니다.
- r = √uniform() 으로 반지름 비율을 계산합니다. 여기서 제곱근을 취하는 것이 핵심인데, 이렇게 해야 원 전체 영역에 점이 균일하게 분포됩니다. 제곱근 없이 r = uniform()을 사용하면 중심 근처에 점들이 몰리게 됩니다.
- (center_x + r × radius × cos(theta), center_y + r × radius × sin(theta)) 쌍을 반환합니다.
아래 예제 코드를 통해 더 자세히 이해해 보겠습니다.
예제 코드
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
const double PI = 3.14159265358979732384626433832795;
double m_radius, m_x_center, m_y_center;
double uniform() {
return (double)rand() / RAND_MAX;
}
Solution(double radius, double x_center, double y_center) {
srand(time(NULL));
m_radius = radius; m_x_center = x_center; m_y_center = y_center;
}
vector<double> randPoint() {
double theta = 2 * 3.14159265358979323846264 * uniform();
double r = sqrt(uniform());
return vector<double>{
m_x_center + r * m_radius * cos(theta),
m_y_center + r * m_radius * sin(theta)
};
}
};
main(){
Solution ob(10, 5, 7);
print_vector(ob.randPoint());
print_vector(ob.randPoint());
print_vector(ob.randPoint());
}입력
생성자에 10, 5, 7을 전달 randPoint()를 세 번 호출
출력
[1.5441, 9.14912] [-1.00029, 13.9072] [10.2384, 6.49618]
핵심 포인트 정리
이 알고리즘의 핵심은 극좌표(polar coordinate) 변환입니다. 각도 θ는 [0, 2π) 범위에서 균일하게 선택하고, 거리 r은 uniform() 값의 제곱근으로 계산합니다. 면적은 반지름의 제곱에 비례하므로, r²가 균일 분포를 따르도록 하기 위해 sqrt를 적용하는 것입니다. 이렇게 하면 생성된 모든 점이 원 내부에 면적 기준으로 균일하게 분포함을 보장할 수 있습니다. 또한 cos과 sin 함수를 활용해 데카르트 좌표계(x, y)로 변환한 뒤 중심 좌표를 더해 최종 위치를 얻습니다.