𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 1222번: 홍쀀 ν”„λ‘œκ·Έλž˜λ° λŒ€νšŒ - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 1222번: 홍쀀 ν”„λ‘œκ·Έλž˜λ° λŒ€νšŒ - C++

.23 2022. 1. 18. 15:10
문제

ν™μ€€μ΄λŠ” ν”„λ‘œκ·Έλž˜λ° λŒ€νšŒλ₯Ό κ°œμ΅œν–ˆλ‹€. 이 λŒ€νšŒλŠ” μ‚¬λžŒλ“€μ΄ νŒ€μ„ μ΄λ£¨μ–΄μ„œ μ°Έκ°€ν•΄μ•Ό ν•˜λ©°, νŒ€μ›μ˜ μˆ˜λŠ” 홍쀀이가 μ •ν•΄μ€€λ‹€. νŒ€μ›μ΄ 홍쀀이가 μ •ν•œ 값보닀 λΆ€μ‘±ν•˜λ‹€λ©΄, κ·Έ νŒ€μ€ λŒ€νšŒμ— μ°Έμ—¬ν•  수 μ—†λ‹€. λͺ¨λ“  νŒ€μ€ 같은 수의 νŒ€μ›μœΌλ‘œ 이루어져 μžˆλ‹€.

λŒ€νšŒμ— μ°Έμ—¬ μ˜μ‚¬λ₯Ό 밝힌 ν•™κ΅λŠ” 총 Nκ°œμ΄λ‹€. 각 ν•™κ΅λŠ” λͺ¨λ“  학생이 μ°Έμ—¬ν•  수 μžˆλŠ” κ²½μš°μ—λ§Œ λŒ€νšŒμ— μ°Έκ°€ν•œλ‹€. 즉, λ‚¨λŠ” μ‚¬λžŒ 없이 λͺ¨λ“  학생이 νŒ€μ— λ“€μ–΄κ°ˆ 수 μžˆμ–΄μ•Ό ν•œλ‹€.

λŒ€νšŒλŠ” μ˜ˆμ„ κ³Ό λ³Έμ„ μœΌλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€. λͺ¨λ“  νŒ€μ€ 같은 학ꡐ μ†Œμ†μœΌλ‘œ 이루어져 μžˆμ–΄μ•Ό ν•œλ‹€. μ˜ˆμ„ μ—μ„œ 각 학ꡐ 1λ“±νŒ€λ§Œ 본선에 μ§„μΆœν•œλ‹€. 

ν™μ€€μ΄μ˜ λŒ€νšŒλŠ” μ˜¬ν•΄κ°€ 첫 해이기 λ•Œλ¬Έμ—, λ§Žμ€ 관심이 ν•„μš”ν•˜λ‹€. λ”°λΌμ„œ, 본선에 μ°Έκ°€ν•˜λŠ” μ‚¬λžŒμ˜ 수λ₯Ό μ΅œλŒ€κ°€ λ˜λ„λ‘ νŒ€μ›μ˜ 수λ₯Ό μ •ν•˜λ €κ³  ν•œλ‹€. 또, 본선이 μ§€λ£¨ν•΄μ§€λŠ” 것을 막기 μœ„ν•΄ 적어도 두 νŒ€μ΄ 본선에 μ°Έκ°€ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.

홍쀀이가 νŒ€μ›μ„ λͺ‡ λͺ…μœΌλ‘œ μ •ν•΄μ•Ό 본선에 μ°Έκ°€ν•˜λŠ” μ‚¬λžŒμ˜ μˆ˜κ°€ μ΅œλŒ€κ°€ λ˜λŠ”μ§€ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 쀄에 ν™μ€€μ΄μ˜ λŒ€νšŒμ— μ°Έμ—¬ μ˜μ‚¬λ₯Ό 밝힌 ν•™κ΅μ˜ 수 N (2 ≤ N ≤ 200,000)이 주어진닀.

λ‘˜μ§Έ μ€„μ—λŠ” 각 학ꡐ ν•™μƒμ˜ μˆ˜κ°€ 주어진닀. ν•™μƒμ˜ μˆ˜λŠ” ꡬ간 [1, 2,000,000]에 ν¬ν•¨λœλ‹€.

 

좜λ ₯

첫째 쀄에 ν™μ€€μ΄μ˜ λŒ€νšŒ 본선에 μ°Έκ°€ν•˜λŠ” μ‚¬λžŒμ˜ 수의 μ΅œλŒ“κ°’μ„ 좜λ ₯ν•œλ‹€.


말도 μ–΄λ ΅κ³  쑰건도 많고 μ—¬λŸ¬λͺ¨λ‘œ 문제 이해뢀터 νž˜λ“€μ—ˆλ‹€γ… γ… 

좜λ ₯λ˜λŠ” μˆ˜λŠ” 본선에 μ°Έκ°€ν•˜λŠ” νŒ€μ˜ μˆ˜λ‚˜ ν•œ νŒ€λ‹Ή μΈμ›μˆ˜κ°€ μ•„λ‹Œ μ‚¬λžŒμ˜ 총 μΈμ›μˆ˜μ΄λ‹€. 본선에 μ°Έκ°€ν•˜λŠ” νŒ€μ€ λͺ¨λ‘ 같은 수의 νŒ€μ›μ„ κ°€μ Έμ•Ό 되고, 본선에 μ§„μΆœν•˜λŠ” ν•™κ΅μ—μ„œλŠ” λ‚¨λŠ” μ‚¬λžŒ 없이 λͺ¨λ“  학생이 νŒ€μ— λ“€μ–΄κ°ˆ 수 μžˆμ–΄μ•Ό ν•œλ‹€.

즉, μ˜ˆμ„ μ— μ°Έκ°€ν•œ ν•™κ΅μ˜ 학생 수 μ‚¬μ΄μ—μ„œ μ•½μˆ˜λ₯Ό μ°Ύκ³  κ±°κΈ°μ„œ κ°€μž₯ λ§Žμ€ μΈμ›μˆ˜κ°€ μ°Έμ—¬ν•  수 μžˆλŠ” 경우λ₯Ό 골라야 ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

 

long long int team = 0;
for(int i = 1; i <= maximum; i++) {
    long long int count = 0;
    for(int j = 0; j < N; j++) {
        if(school[j] % i == 0) {
            count += i;
        }
    }
    if(count > team) {
        team = count;
    }
}

μ²˜μŒμ— μ΄λŸ°μ‹μœΌλ‘œ 생각을 ν–ˆλŠ”λ°, 숫자의 λ²”μœ„λ₯Ό λ³΄μ•„ν•˜λ‹ˆ 딱봐도 μ‹œκ°„μ΄ˆκ³Όκ°€ 날것같아 제좜 μ‹œλ„μ‘°μ°¨ μ•ˆν•΄λ³΄κ³  κ·Έλƒ₯ μ‹œκ°„λ³΅μž‘λ„λ₯Ό 쀄일 수 μžˆλŠ” 방법을 μ°Ύμ•„λ΄€μ—ˆλ‹€..

 

μ²˜μŒμ— 값을 받을 λ•Œ 학ꡐ 배열에 ν•™μƒμˆ˜λ₯Ό λ„£μ–΄μ£ΌλŠ” 것이 μ•„λ‹ˆλΌ, 1λΆ€ν„° 200만 μ‚¬μ΄μ˜ 학생 수λ₯Ό λ°°μ—΄λ‘œ λ§Œλ“  λ’€ 인덱슀 만큼의 인원이 μ°Έμ—¬ν•˜λŠ” ν•™κ΅μ˜ 수λ₯Ό μ„Έμ£ΌλŠ” λ°©μ‹μœΌλ‘œ ν‘ΈλŠ” 방법이 μžˆλ”λΌ....

for(int i = 1; i <= MAX; i++) {
    long long int count = 0;
    for(int j = 1; j * i <= MAX; j++) {
        count += school[i * j];
    }
    if(count < 2) continue;
    team = max(team, count * i);
}

κ·Έ 외에 기본적인 μ•„μ΄λ””μ–΄λŠ” κ°™μ•˜λ‹€. μ˜ˆμ„ μ— μ°Έμ—¬ν•˜λŠ” 학ꡐ가 두 νŒ€μΌ 경우 두 νŒ€ λͺ¨λ‘ μ˜¬λΌκ°€μ•Ό 되기 λ•Œλ¬Έμ— 두 μˆ˜κ°„ μ΅œλŒ€κ³΅μ•½μˆ˜λ§Œ ꡬ해쀀 λ’€ λ„˜μ–΄κ°€κ³ , λ‹€λ₯Έ κ²½μš°μ— 계속 μ΅œλŒ“κ°’μ„ 비ꡐ해주며 i * j만큼의 μΈμ›μˆ˜κ°€ μ°Έμ—¬ν•˜λŠ” 학ꡐλ₯Ό 계속 μ„Έμ£Όμ–΄ νŒ€μ›μˆ˜ * 학ꡐ μˆ˜μ™€ 기쑴의 μ΅œλŒ“κ°’μ„ 비ꡐ해쀀 λ’€, λ§ˆμ§€λ§‰ μ΅œλŒ“κ°’μ„ 좜λ ₯ν•΄μ€€λ‹€.

 

λ‹Ήμ—°νžˆ 2000000 * 200000을 κ°μ•ˆν•˜μ—¬ μžλ£Œν˜•μ€ long long int둜 μ„€μ •ν•΄μ£ΌκΈ°

 

μ½”λ“œ
#include <cstdio>
#define MAX 2000001

long long int max(long long int a, long long int b) {
    return a > b ? a : b;
}

int school[MAX] = { 0 };

int main(void) {
    int N;
    scanf("%d", &N);

    for(int i = 0; i < N; i++) {
        int temp;
        scanf("%d", &temp);
        school[temp]++;
    }

    long long int team = 0;
    for(int i = 1; i <= MAX; i++) {
        long long int count = 0;
        for(int j = 1; j * i <= MAX; j++) {
            count += school[i * j];
        }
        if(count < 2) continue;
        team = max(team, count * i);
    }

    printf("%lld\n", team);
    return 0;
}
Comments