https://www.acmicpc.net/problem/9020
1λ³΄λ€ ν° μμ°μ μ€μμ 1κ³Ό μκΈ° μμ μ μ μΈν μ½μκ° μλ μμ°μλ₯Ό μμλΌκ³ νλ€. μλ₯Ό λ€μ΄, 5λ 1κ³Ό 5λ₯Ό μ μΈν μ½μκ° μκΈ° λλ¬Έμ μμμ΄λ€.
λ, μ§μλ₯Ό λ μμμ ν©μΌλ‘ λνλ΄λ ννμ κ·Έ μμ 골λλ°ν νν°μ μ΄λΌκ³ νλ€. μλ₯Ό λ€λ©΄, 4 = 2 + 2, 6 = 3 + 3, 8 = 3 + 5, 10 = 5 + 5, 12 = 5 + 7, 14 = 3 + 11, 14 = 7 + 7μ΄λ€. 10000λ³΄λ€ μκ±°λ κ°μ λͺ¨λ μ§μ nμ λν 골λλ°ν νν°μ μ μ‘΄μ¬νλ€.
2λ³΄λ€ ν° μ§μ n(4 β€ n β€ 10,000)μ΄ μ£Όμ΄μ‘μ λ, nμ 골λλ°ν νν°μ μ μΆλ ₯νλ νλ‘κ·Έλ¨μ μμ±νμμ€. λ§μ½ κ°λ₯ν nμ 골λλ°ν νν°μ μ΄ μ¬λ¬ κ°μ§μΈ κ²½μ°μλ λ μμμ μ°¨μ΄κ° κ°μ₯ μμ κ²μ μΆλ ₯νλ€.
μ°λ¦° μνμ΄ μλ λ¬Έμ ..
λ΄κ° κ°μμ λ¨Ήκ³ , μ λ
μ λ¨Ήκ³ μμ λ΄λ μκ° μ΄κ³Όκ° ν΄κ²°λμ§ μμλ€..
μ¬κΈ°μμ κ°μ₯ μ€μν 건 λκ° λ΄λ 2μ€ forλ¬Έμ λλ €μΌ νλλ° κ·Έ κ°μ μμμ κ³Ό λμ μ΄λ»κ² λμ κ²μΈκ°!!! μ΄κ²μ΄ μκ°μ΄κ³Όλ₯Ό λ§κΈ° μν μ μΌν λ°©λ²(λ¬Όλ‘ λ΄ κΈ°μ€)
μ²μμ λλ i=2λΆν° μμν΄μ 2μ€ forλ¬ΈμΌλ‘ μμͺ½μ forλ¬Έμ 1μ© μ¦κ°μμΌμ μ λ ₯κ°κ³Ό μΌμΉνκ³ κ°μ₯ μ΅μμ ν¬κΈ°μ΄λ©΄ κ²°κ³Όκ°μ μΆλ ₯νλ μμΌλ‘ μκ³ λ¦¬μ¦μ μ§°λλ° κ³μ μκ°μ΄κ³Όκ° λμλ€.
νμ§λ§ λ΄κ° μκ°ν΄λ μκ°μ΄κ³Όκ° λμ¬λ²ν μ½λλ‘ κ³μ μμ νκ³ μμλ€.
for (int i = n/2; i >=2; i--)
μ°λ¦¬κ° 30κΉμ§ μμλ₯Ό μκ°ν΄λ³΄λ©΄
2/ 3/ 5/ 7/ 11/ 13/ 17/ 19/ 23/ 29 μΈλ° λ΄ μ½λμμ μ΄λ€μ μΈλ±μ€κ° κ³§ κ°μ΄λ€.
μλ₯Ό λ€μ΄ μ λ ₯μ΄ 8μ΄ λ€μ΄μμ κ²½μ° κ³¨λλ°νμ νν°μ μ λ€μ΄μ¬ μ μλ result1κ³Ό result2λ λνμμ λ 8μ΄μ΄μΌ νλλ° μ΄ λ μλ λμμ 4λ³΄λ€ λ ν° κ°μ κ°μ§ μ μλ€. κ·Έλμ μ μ΄μ μμμ λΆν° i=n/2μΌλ‘ μμνκ³ μ μ μ€μ¬μ£Όλ μͺ½μΌλ‘ μ½λλ₯Ό λ§λ€μ΄μ€μΌ νλ€.
#include <iostream>
#include <algorithm>
using namespace std;
int n;
int arr[10000] = { 0 };
void check(int start) {
int result[2] = { 0 }; // κ²°κ³Ό μ μ₯μ© λ°°μ΄(κ΅³μ΄ λ°°μ΄ μ¬μ©ν νμλ μλ€.)
int min = 10000; // 골λλ°νμ νν°μ
μ λ μμμ μ°¨μ΄κ° κ°μ₯ μ μ΄μΌ νλ―λ‘ κ΅¬λΆμ© λ³μ μ μΈ
for (int i = n/2; i >=2; i--) {
if (arr[i] == 0) continue; // μμκ° μλλ©΄ pass
int cnt = 0; // νν°μ
ν¬κΈ° λΉκ΅μ© λ³μ
for (int j = i; j <= n; j++) {
cnt++;
if (n < arr[j]) break; // μ
λ ₯κ°λ³΄λ€ λ°°μ΄μ κ°μ΄ λ ν¬λ€λ©΄ break
if (min <= cnt) break; // μμμ μ°¨μ΄ λΉκ΅
if (arr[i] + arr[j] == n) { // μ
λ ₯κ°κ³Ό κ°μμ§λ€λ©΄
if (cnt < min) {
min = cnt; // μΉ΄μ΄νΈκ°μ minμλ€κ° λ£μ΄μ£Όκ³
result[0] = arr[i]; // μΆλ ₯ν λμμ μ μ₯
result[1] = arr[j];
}
}
}
}
cout << result[0] << ' ' << result[1] << '\n';
}
int main() {
cin.tie(NULL);
cout.tie(NULL);
ios::sync_with_stdio(false);
int t;
cin >> t;
for (int i = 2; i <= 10000; i++) {
arr[i] = i;
}
for (int i = 2; i <= 10000; i++) {
if (arr[i] == 0) continue;
else {
for (int j = i * 2; j <= 10000; j += i) {
arr[j] = 0;
}
}
}
while (t > 0) {
cin >> n;
check(n);
t--;
}
return 0;
}