λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
✨ Algorithm

[λ°±μ€€/C++] 9020번 : κ³¨λ“œλ°”νμ˜ μΆ”μΈ‘

by nitronium102 2021. 8. 10.

문제

1보닀 큰 μžμ—°μˆ˜ μ€‘μ—μ„œ  1κ³Ό 자기 μžμ‹ μ„ μ œμ™Έν•œ μ•½μˆ˜κ°€ μ—†λŠ” μžμ—°μˆ˜λ₯Ό μ†Œμˆ˜λΌκ³  ν•œλ‹€. 예λ₯Ό λ“€μ–΄, 5λŠ” 1κ³Ό 5λ₯Ό μ œμ™Έν•œ μ•½μˆ˜κ°€ μ—†κΈ° λ•Œλ¬Έμ— μ†Œμˆ˜μ΄λ‹€. ν•˜μ§€λ§Œ, 6은 6 = 2 × 3 이기 λ•Œλ¬Έμ— μ†Œμˆ˜κ°€ μ•„λ‹ˆλ‹€.

κ³¨λ“œλ°”νμ˜ 좔츑은 유λͺ…ν•œ μ •μˆ˜λ‘ μ˜ λ―Έν•΄κ²° 문제둜, 2보닀 큰 λͺ¨λ“  μ§μˆ˜λŠ” 두 μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€λŠ” 것이닀. μ΄λŸ¬ν•œ 수λ₯Ό κ³¨λ“œλ°”ν 수라고 ν•œλ‹€. 또, 짝수λ₯Ό 두 μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” ν‘œν˜„μ„ κ·Έ 수의 κ³¨λ“œλ°”ν νŒŒν‹°μ…˜μ΄λΌκ³  ν•œλ‹€. 예λ₯Ό λ“€λ©΄, 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이 μ£Όμ–΄μ‘Œμ„ λ•Œ, n의 κ³¨λ“œλ°”ν νŒŒν‹°μ…˜μ„ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. λ§Œμ•½ κ°€λŠ₯ν•œ n의 κ³¨λ“œλ°”ν νŒŒν‹°μ…˜μ΄ μ—¬λŸ¬ 가지인 κ²½μš°μ—λŠ” 두 μ†Œμˆ˜μ˜ 차이가 κ°€μž₯ μž‘μ€ 것을 좜λ ₯ν•œλ‹€.

μž…λ ₯

첫째 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 Tκ°€ 주어진닀. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” ν•œ μ€„λ‘œ 이루어져 있고 짝수 n이 주어진닀.

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ 주어진 n의 κ³¨λ“œλ°”ν νŒŒν‹°μ…˜μ„ 좜λ ₯ν•œλ‹€. 좜λ ₯ν•˜λŠ” μ†Œμˆ˜λŠ” μž‘μ€ 것뢀터 λ¨Όμ € 좜λ ₯ν•˜λ©°, 곡백으둜 κ΅¬λΆ„ν•œλ‹€.

μ œν•œ

  • 4 ≤ n ≤ 10,000

풀이

이 문제의 핡심은 N/2 - i와 N/2 + iκ°€ λ‘˜ λ‹€ μ†Œμˆ˜μ—¬μ•Ό ν•œλ‹€λŠ” 것이닀. (N - i와 i의 κ΄€κ³„λ‘œλ„ 생각할 수 μžˆλ‹€)

 

https://cryptosalamander.tistory.com/30의 ν’€μ΄μ—μ„œ 배열에 μ €μž₯ν•˜λŠ” 뢀뢄을 μ°Έκ³ ν–ˆλ‹€! λ‚˜λŠ” MAX=10000으둜 놓고 λŒλ¦¬κ±°λ‚˜ 맀 μž…λ ₯λ§ˆλ‹€ for문으둜 μ²˜λ¦¬ν–ˆλŠ”λ°, μ•„μ˜ˆ μ²˜μŒλΆ€ν„° ν•œ λ²ˆμ— λ°›μ•„μ„œ 배열에 λ„£κ³  κ³„μ‚°ν•˜λŠ” 방식이 더 κΉ”λ”ν•œ 것 κ°™λ‹€!

#include <iostream>
#include <cmath>
using namespace std;

int main(){
  int T, max=0;
  cin >> T;

  // ν•œκΊΌλ²ˆμ— λ°›μ•„μ„œ 배열에 μ €μž₯
  int *num = new int[T]; 
  for (int i = 0; i<T; i++){
    cin >> num[i];
    if (max < num[i])
      max = num[i];
  }

  // ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 졜고 κΈΈμ΄κΉŒμ§€ bool λ°°μ—΄ 생성
  bool isPrime[max+1];
  fill_n(isPrime, max+1, true);
  isPrime[0] = false;
  isPrime[1] = false;

  // μ†Œμˆ˜ νŒμ •
  for (int i=2; i<=sqrt(max); i++){
    if (isPrime[i]){
      for (int j=i*2; j<=max; j+=i)
        isPrime[j] = false;
    }
  }

  // κ³¨λ“œλ°”ν νŒŒν‹°μ…˜ 좜λ ₯ -> N/2 + i와 N/2 - iκ°€ λͺ¨λ‘ μ†Œμˆ˜κ°€ λ˜λ„λ‘
  for (int i=0; i<T; i++){
    for (int j=num[i]/2; j>0; j--){
      if (isPrime[j] && isPrime[num[i]-j]){
        cout << j << " " << num[i]-j << "\n";
        break;
      }
    }
  }

}

N/2κΉŒμ§€λŠ” μ•Œμ•˜μœΌλ‚˜ κ±°κΈ°μ—μ„œ 잘λͺ» μ ‘κ·Όν•΄μ„œ 쑰금 μ–΄λ €μ› λ˜ 문제

λŒ“κΈ€