[๋ฌธ์ ]
"4๋ณด๋ค ํฐ ๋ชจ๋ ์ง์๋ ๋ ํ์ ์์์ ํฉ์ผ๋ก ๋ํ๋ผ ์ ์๋ค." ๋ ๊ณจ๋๋ฐํ์ ์ถ์ธก์ด ๋ง๋์ง ํ๋ ธ๋์ง ํ์ธํ๋ ๋ฌธ์ .
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด์, n = a + b ํํ๋ก ์ถ๋ ฅํ๋ค. ์ด๋, a์ b๋ ํ์ ์์์ด๋ค.
๋ง์ฝ, n์ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์ด ์ฌ๋ฌ ๊ฐ์ง๋ผ๋ฉด, b-a๊ฐ ๊ฐ์ฅ ํฐ ๊ฒ์ ์ถ๋ ฅํ๋ค.
๋ ํ์ ์์์ ํฉ์ผ๋ก n์ ๋ํ๋ผ ์ ์๋ ๊ฒฝ์ฐ์๋ "Goldbach's conjecture is wrong."์ ์ถ๋ ฅํ๋ค.
[ํ์ด]
์๊ฐ ์ ํ 1์ด.
ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์๋ 100,000๊ฐ.
ํ์ธํด์ผํ ์ง์ ์ ์ n์ ๋ฒ์. 6 ≤ n ≤ 1000000
1์ด์ ์ ํ ์๊ฐ์ ๋๊ธฐ์ง ์์ผ๋ ค๋ฉด ์ฐ์ฐ ํ์๊ฐ 1์ต ๋ฒ์ ์ด๊ณผํ๋ฉด ์๋๋ค.
ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์๊ฐ 100,000๊ฐ์ด๊ณ ํ์ธํด์ผํ ์ง์ ์ ์์ ๋ฒ์๊ฐ 1,000,000 ๊น์ง์ด๋ฏ๋ก 1๋ถํฐ n๊น์ง ๋ชจ๋ ์๋ฅผ ํ์ธํ๋ค๋ฉด ์ต์ ์ ๊ฒฝ์ฐ 100,000 * 1,000,000 ์ ์ฐ์ฐ์ ์ํํ๊ฒ ๋์ด 100,000,000,000 = 1,000์ต ๋ฒ์ ์ฐ์ฐ์ ์ํํด์ผ ํ๋ค. ์ด ๋์ ์ฐ์ฐ ์ฒ๋ฆฌ ์๊ฐ์ 1000์ด๊ฐ ๋ ๊ฒ์ด๋ค. ๋ฃจํธn๊น์ง ํ์ธํ๋ค๊ณ ํด๋ 100,000 * 1,000 = 100,000,000 = 10์ต ๋ฒ์ ์ฐ์ฐ์ ์ํํด์ผ ํ๋ค. ์์ง 10์ด...
๋ฐ๋ผ์ ์๋ ํ ์คํ ๋ค์ค์ ์ฒด๋ฅผ ํ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ์ด์ผ ํจ์ ์ ์ ์๋ค. ์๋ ํ ์คํ ๋ค์ค์ ์ฒด๋ 2๋ถํฐ ์์ ์ ๋ฐฐ์๋ฅผ ๋ค ์ง์ฐ๋ ๋ฐฉ๋ฒ์ผ๋ก ์๊ฐ๋ณต์ก๋ O(N(log(logN)))๋ฅผ ๊ฐ์ง๋ค.
๊ทธ๋ฌ๋.......... ์๋ฌด๋ฆฌ ์ค์ฌ๋ ์ ์ถ๋ ฅ์๊ฐ์ ์ค์ด์ง ๋ชปํด ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค. ๊ทธ๋ฆฌ๊ณ 1๋ฒ, 2๋ฒ ํ์ด ๋ชจ๋ ์๋ ๊ตฌ๋ฌธ์ ์ถ๊ฐํด์ฃผ๋ ํด๊ฒฐ๋์๋ค. ์ด ๊ตฌ๋ฌธ์ ์์ฐ๊ณ ํด๊ฒฐํ๋ ค๋ฉด cin, cout ๋์ ์ scanf, prinf๋ฅผ ์ฌ์ฉํ๋ฉด ํด๊ฒฐ๊ฐ๋ฅํ๋ค. (4๋ฒ ์ฝ๋ ์ฐธ๊ณ . ์ด๋ฏธ C์ธ์ด๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์๊ด์์!)
cin.tie(NULL);
cout.tie(NULL);
ios_base::sync_with_stdio(false);
๋ง์น๋ฉด์... C++ ์ ์ถ๋ ฅ ์๊ฐ ๋จ์ถ์ ๊ดํ์ฌ ์ ๋ฆฌํด๋ณด์๋ฉด!
1. cin, cout ๋์ ์ scanf, printf๋ฅผ ์ฐ์. scanf๋ 0.798์ด์ ์ํ์๊ฐ์ ๊ฐ์ง๋๋ฐ, cin์ 2.051์ด์ ์๊ฐ์ ๊ฐ๋๋ค๊ณ ํ๋ค.(์ถ์ฒ: https://2heedu.tistory.com/64)
์ฐธ๊ณ ๋ก ์์ ๊ตฌ๋ฌธ์ผ๋ก c++๊ณผ c์ ํ์ค ์คํธ๋ฆผ์ ๋๊ธฐํ ๋๋ฉด ์ ์ถ๋ ฅ ์๋๋ฅผ ์ค์ผ ์ ์๋ค. ํ์ง๋ง c์ c++ ์ ์ถ๋ ฅ ์์๊ฐ ๋ณด์ฅ๋์ง ์์ ๋ ๋ฌธ๋ฒ์ ์์ด์ผ์ ๋, ์์๊ฐ ๋ค์์ฌ ๋์ฌ ์ ์๊ณ , c++ ์คํธ๋ฆผ๋ค์ thread ์์ ์ฑ ์ญ์ ๋ณด์ฅ๋์ง ์๋๋ค.
2. endl ๋์ "\n"๋ฅผ ์ฐ์. endl์ ๊ฐํ์ ํ ๋ฟ ์๋๋ผ ๋ด๋ถ ๋ฒํผ๋ ๋น์์ฃผ๋ฏ๋ก "\n"๋ณด๋ค ์๋๊ฐ ๋๋ฆฌ๋ค.
[์ฝ๋] 3, 4๋ฒ ์ฝ๋๊ฐ ์ ๋ต ์ฝ๋!
1๋ฒ ํ์ด. ์๊ฐ์ด๊ณผ.
#include <iostream>
#include <cmath>
using namespace std;
bool canGoldBahGuess(int num);
bool isPrime(int num);
int main() {
int num;
while(true) {
cin >> num;
if (num == 0) break;
if (!canGoldBahGuess(num)) cout << "Goldbach's conjecture is wrong.\n";
}
return 0;
}
bool canGoldBahGuess(int num) {
for (int i = 3; i <= num/2; i++) {//3๋ถํฐ ํ์&์์ ํ๋ณ
if (i % 2 != 0 && isPrime(i) && (num-i) % 2 != 0 && isPrime(num - i)){
cout << num << " = " << i << " + " << num - i << "\n";
return true;
}
}
return false;
}
bool isPrime(int num) {
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) return false;
}
return true;
}
2๋ฒ ํ์ด. ์๊ฐ์ด๊ณผ
#include <iostream>
#include <cmath>
using namespace std;
void MakeDecimalTable();
bool canGoldbach(int num);
const int MAX_SIZE = 1000000;
int decimalTable[MAX_SIZE + 1];
int main() {
int num;
bool answer = true;
MakeDecimalTable();
while(true) {
cin >> num;
if (num == 0) break;
if (!canGoldbach(num)) cout << "Goldbach's conjecture is wrong.\n";
}
return 0;
}
void MakeDecimalTable() {
fill_n(decimalTable, sizeof(decimalTable)/sizeof(int), 1);
for (int i = 2; i <= sqrt(MAX_SIZE ); i++) {//2๋ถํฐ ์์ํ๋ณํ๋ฌ gogo
if (decimalTable[i] != 0) {
for (int j = 2; i*j <= MAX_SIZE ; j++) {//๊ทธ ๋ฐฐ์๋ฅผ ๋ชจ๋ 0์ผ๋ก ๋ฐ๊ฟ
decimalTable[i*j] = 0;
}
}
}
}
bool canGoldbach(int num) {
for (int i = 3; i <= num / 2; i++) {//3๋ถํฐ ์์ ํ๋ณ
if (decimalTable[i] && decimalTable[num - i]) {
cout << num << " = " << i << " + " << num - i << "\n";
return true;
}
}
return false;
}
3๋ฒ ํ์ด. ํต๊ณผ.
#include <iostream>
#include <cmath>
using namespace std;
void MakePrimeTable();
bool canGoldbach(int num);
const int MAX_SIZE = 1000000;
int primeTable[MAX_SIZE + 1];
int main() {
cin.tie(NULL);
cout.tie(NULL);
ios_base::sync_with_stdio(false);
int num;
bool answer = true;
MakePrimeTable();
while(true) {
cin >> num;
if (num == 0) break;
if (!canGoldbach(num)) cout << "Goldbach's conjecture is wrong.\n";
}
return 0;
}
void MakePrimeTable() {//์๋ผํ ์คํ
๋ค์ค์ ์ฒด
for (int i = 2; i <= sqrt(MAX_SIZE); i++) {//2๋ถํฐ ์์ํ๋ณํ๋ฌ gogo
if (primeTable[i] == 0) {
for (int j = 2; i*j <= MAX_SIZE; j++) {//๊ทธ ๋ฐฐ์๋ฅผ ๋ชจ๋ 0์ผ๋ก ๋ฐ๊ฟ
primeTable[i*j] = 1;
}
}
}
}
bool canGoldbach(int num) {
for (int i = 3; i <= num / 2; i++) {//3๋ถํฐ ์์ ํ๋ณ
if (primeTable[i] == 0 && primeTable[num - i] == 0) {
cout << num << " = " << i << " + " << num - i << "\n";
return true;
}
}
return false;
}
4๋ฒ ํ์ด. ํต๊ณผ
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
const int MAX_SIZE = 1000000;
int main() {
vector<int> primeTable;
bool primeNoCheckTable[MAX_SIZE + 1];
for (int i = 2; i*i <= MAX_SIZE; i++) {//2๋ถํฐ ์์ํ๋ณํ๋ฌ gogo
if (!primeNoCheckTable[i]) {
if(i != 2) primeTable.push_back(i);
for (int j = i + i; j <= MAX_SIZE; j += i) {//๊ทธ ๋ฐฐ์๋ฅผ ๋ชจ๋ ์์ ํ์ธ์ ๋๋๋ค๋ ์๋ฏธ๋ก true๋ก ๋ฐ๊ฟ
primeNoCheckTable[j] = true;
}
}
}
int num;
bool answer;
while (true) {
scanf("%d", &num);
if (num == 0) break;
for (int prime : primeTable) {
if (!primeNoCheckTable[num - prime]) {
printf("%d = %d + %d\n", num, prime, num - prime);
answer = true;
break;
}
}
if (!answer) printf("Goldbach's conjecture is wrong.\n");
}
return 0;
}
'๐ Coding Test Study > Algorithm Problem' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++][Baekjoon][๋นํธ๋ง์คํฌ] 11723๋ฒ ์งํฉ (0) | 2022.05.08 |
---|---|
[C++][Baekjoon] 10971๋ฒ ์ธํ์ ์ํ2 (0) | 2022.05.08 |
[C++][Baekjoon][Math] 1978๋ฒ ์์์ฐพ๊ธฐ (0) | 2022.04.03 |
[C++][BAEKJOON] 9613๋ฒ GCDํฉ (0) | 2022.04.02 |
[C++][Baekjoon][BFS ํ์] 2206๋ฒ ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ ์์ธ ํด์ค (0) | 2021.10.16 |