문제
문제 요약
x^2+y^2<=N^2인 격자점의 개수를 구하는 프로그램을 작성
격자 점의 개수를 구하라고 하니 무조건 정수의 값만 구하면 된다.
예를 들어 N값이 2로 들어왔을 때 반지름이 2인 원이 생성된다고 생각하자.
그러면 반지름이 2인 원에 정수값으로 x^2+y^2<=N^2 이 공식이 성립되는 좌표 값은
X | Y |
0 | 0 |
1 | 1 |
2 | 0 |
0 | 1 |
0 | 2 |
-1 | 1 |
-2 | 0 |
-1 | -1 |
0 | -1 |
0 | -2 |
1 | -1 |
1 | 0 |
-1 | 0 |
이런 식의 13개의 좌표 값이 나올 것이다.
우선 2중 반복문으로 x^2+y^2<=N^2이 공식이 성립되면 count 값을 증가시키는 반복문을 만들어 보자
for (int i = 0; i <= N; i++) {
for (int j = 0; j <= N; j++) {
if ((i * i) + (j * j) <= N * N) {
cnt++;
}
}
}
이렇게 만들면 (0,0), (1,0), (2,0), (1,1), (0,1), (0,2) 좌표값인 총 cnt가 6개가 될 것이다.
우리는 1사분면의 개수만 구했다. 이제 총 4사분면에 해당하는 값을 구해줘야 한다.
1. 4사분면의 개수를 구하기 위해 4*cnt를 해준다.
2. 4사분면의 개수를 구했기 때문에 (0,0)은 4개가 중복된다 따라서 -3을 해준다.
3. 원의 경계 선분에 위치한 좌표는 중복해서 세어진다. 따라서 N만큼의 좌표가 원의 경계선에 존재하므로 4*N 값을 빼준다.
코드
#include<iostream>
using namespace std;
int main(int argc, char** argv)
{
int test_case;
int T;
int N;
int cnt = 0;
cin >> T;
for (test_case = 1; test_case <= T; ++test_case)
{
cin >> N;
cnt = 0;
for (int i = 0; i <= N; i++) {
for (int j = 0; j <= N; j++) {
if ((i * i) + (j * j) <= N * N) {
cnt++;
}
}
}
cout << "#" << test_case << " " << 4 * cnt - 3 - 4 * N << endl;
}
return 0;
}
'📖Algorithm > Simulation, Math' 카테고리의 다른 글
자바 [Programmers] 2단계 - 올바른 괄호 (0) | 2024.11.25 |
---|---|
C++ [Algorithm] - 백준 10810 공 넣기 (0) | 2024.08.06 |
C++ [Algorithm] - 백준 10815 문자열 집합 (0) | 2024.08.01 |
C++ [Algorithm] - 백준 13458 시험 감독 (0) | 2024.07.29 |
자바 [Programmers] 1단계 - 부족한 금액 계산하기 (Math.abs()) (0) | 2024.03.12 |