-
[백준 9020] 골드바흐의 추측C 프로그래밍/BOJ 2022. 7. 31. 21:46728x90
https://www.acmicpc.net/problem/9020
9020번: 골드바흐의 추측
1보다 큰 자연수 중에서 1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아
www.acmicpc.net
#include <stdio.h> #include <math.h> void guess(int gb) { int res; int flag_i, flag_r; int min = 10000 - 4, sub, min_i, min_r; for (int i = 2; i < gb; i++) { //두 수 구하기 i & i와 더해서 gb가 되는 res res = gb - i; flag_i = 0, flag_r = 0; //각 숫자마다 플래그 초기화 필요 //printf("%d %d\n", i, res); //debug for (int j = 2; j < gb - 1; j++) { //두 수가 소수인지 판별 if (j * j > gb) break; //타임아웃 방지 if ((j < i) && !(i % j)) { flag_i = 1; break; } if ((j < res) && !(res % j)) { flag_r = 1; break; } } //printf("%d %d\n", flag_i, flag_r); //debug if ((flag_i == 0) && (flag_r == 0)) { sub = abs(i - res); if (sub < min) { //골드바흐 파티션의 거리가 최소인 것을 찾음 min = sub; min_i = i; min_r = res; } } } printf("%d %d\n", min_i, min_r); } int main(void) { int n, gb; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &gb); guess(gb); } return 0; }
기존 소수찾는 문제와는 다르게 생각할 것이 좀 있었다.
1. 일단 해당 숫자를 이루는 두 수를 찾아야 한다.
2. 두 수가 소수인지 판별해야 한다.
3. 해당 숫자를 이루는 두 수(골드바흐 파티션)가 여러 개인 경우, 두 수의 차이가 가장 작은 것을 선택한다.
(1)번의 과정은 for문 한개를 돌리면서 i 와 res( = gb - i)로 표현해주었다.
(2)번의 과정은 기존 소수 찾는 문제와 동일하게 플래그를 통해 구현했다.
내가 자주하는 실수를 또 했었는데, 각각의 i와 res에 대하여 플래그를 초기화 해주어야 한다는 점 !! 명심하자.
두 숫자가 소수인지 판별하는 것은 두번째 for문으로 구현했고, 만약 j 가 i나 res 의 약수가 되면 바로 루프를 빠져나오도록 했다. 그럼에도 불구하고 타임아웃이 났었는데, 이는 역시나 if (j * j > gb) break; 조건으로 해결할 수 있었다.
(3)번의 과정은 최대한 라이브러리 안쓰고 싶었는데, 코드가 더 길어지는 것을 방지하고자.. math.h의 abs를 써서 두 수의 차이의 절댓값을 구해주었다. 이를 min과 비교하여 더 작으면 각각의 i와 res를 저장하도록 구현했다.
728x90'C 프로그래밍 > BOJ' 카테고리의 다른 글
[백준 2869] 달팽이는 올라가고 싶다 (0) 2022.08.01 [백준 1978] 소수 찾기 (0) 2022.07.31 [백준 4948] 베르트랑 공준 (0) 2022.07.29 [백준 2581] 소수 (0) 2022.07.29 [백준 1929] 소수 구하기 (0) 2022.07.29