[c/c++] λ°±μ€€ 9020 (Silver 2)

은동·2023λ…„ 2μ›” 18일
0

Baekjoon

λͺ©λ‘ 보기
33/49

πŸ”¨ 문제

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;
}
profile
자자 μ„ μˆ˜μž…μž₯~

0개의 λŒ“κΈ€