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

Algorithm/이둠

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ΄μš©ν•΄ μ†Œμˆ˜ νŒλ³„ν•˜κΈ° (C++)

주어진 λ²”μœ„ λ‚΄μ—μ„œ μ†Œμˆ˜μΆœλ ₯을 μ΅œλŒ€ν•œ λΉ λ₯΄κ²Œ ν•  수 μžˆλŠ” 'μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체' μ•Œκ³ λ¦¬μ¦˜μ„ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

문제 : BOJ_1124번 μ–Έλ”ν”„λΌμž„

λ°±μ€€ 문제 1124번 μ–Έλ”ν”„λΌμž„ λ¬Έμ œμΈλ°μš”. μ‰½κ²Œ λ§ν•΄μ„œ μ–Έλ”ν”„λΌμž„μ€ μ–΄λ–€ 수λ₯Ό μ†ŒμΈμˆ˜ λΆ„ν•΄ ν–ˆμ„ λ•Œ λ‚˜μ˜€λŠ” μ†Œμˆ˜μ˜ κ°œμˆ˜κ°€ μ†Œμˆ˜μΈ 수λ₯Ό λ§ν•©λ‹ˆλ‹€.
정해진 λ²”μœ„μ•ˆμ—μ„œ μ–Έλ”ν”„λΌμž„μ„ κ΅¬ν•˜κΈ°μœ„ν•΄ λ§Žμ€ μ‹œλ„λ₯Ό ν•΄λ³Ό 수 μžˆκ² μ§€λ§Œ, κ²°κ΅­ μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ΄μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ λͺ¨λ‘ μ‹œκ°„μ΄ˆκ³Όμ— κ±Έλ¦°λ‹€λŠ” 것을 μ•Œκ²Œ λ©λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄, μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ μ²΄λŠ” μ–΄λ–€ μ•Œκ³ λ¦¬μ¦˜μΌκΉŒμš”?

μš°μ„  120κΉŒμ§€μ˜ λ²”μœ„μ—μ„œ μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ‚¬μš©ν•˜λŠ” 방법을 μœ„ν‚€λ°±κ³Όμ—μ„œ λ°œμ·Œν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체 μ•Œκ³ λ¦¬μ¦˜

2λΆ€ν„° μ†Œμˆ˜λ₯Ό κ΅¬ν•˜κ³ μž ν•˜λŠ” κ΅¬κ°„μ˜ λͺ¨λ“  수λ₯Ό λ‚˜μ—΄ν•œλ‹€.
2λŠ” μ†Œμˆ˜μ΄λ―€λ‘œ 2λ₯Ό μ†Œμˆ˜λ‘œ μ²΄ν¬ν•œλ‹€.
자기 μžμ‹ μ„ μ œμ™Έν•œ 2의 배수λ₯Ό λͺ¨λ‘ μ§€μš΄λ‹€.
λ‚¨μ•„μžˆλŠ” 수 κ°€μš΄λ° 3은 μ†Œμˆ˜μ΄λ―€λ‘œ 2을 μ†Œμˆ˜λ‘œ μ²΄ν¬ν•œλ‹€.
자기 μžμ‹ μ„ μ œμ™Έν•œ 3의 배수λ₯Ό λͺ¨λ‘ μ§€μš΄λ‹€.
λ‚¨μ•„μžˆλŠ” 수 κ°€μš΄λ° 5λŠ” μ†Œμˆ˜μ΄λ―€λ‘œ 였λ₯Έμͺ½μ— 5λ₯Ό μ†Œμˆ˜λ‘œ μ²΄ν¬ν•œλ‹€.
자기 μžμ‹ μ„ μ œμ™Έν•œ 5의 배수λ₯Ό λͺ¨λ‘ μ§€μš΄λ‹€.
λ‚¨μ•„μžˆλŠ” 수 κ°€μš΄λ° 7은 μ†Œμˆ˜μ΄λ―€λ‘œ 였λ₯Έμͺ½μ— 7을 μ†Œμˆ˜λ‘œ μ²΄ν¬ν•œλ‹€.
자기 μžμ‹ μ„ μ œμ™Έν•œ 7의 배수λ₯Ό λͺ¨λ‘ μ§€μš΄λ‹€.
μœ„μ˜ 과정을 λ°˜λ³΅ν•˜λ©΄ κ΅¬ν•˜λŠ” κ΅¬κ°„μ˜ λͺ¨λ“  μ†Œμˆ˜κ°€ λ‚¨λŠ”λ‹€.
그림의 경우, μ΄λ―€λ‘œ 11보닀 μž‘μ€ 수의 λ°°μˆ˜λ“€λ§Œ μ§€μ›Œλ„ μΆ©λΆ„ν•˜λ‹€.
즉, 120보닀 μž‘κ±°λ‚˜ 같은 수 κ°€μš΄λ° 2, 3, 5, 7의 배수λ₯Ό μ§€μš°κ³  λ‚¨λŠ” μˆ˜λŠ” λͺ¨λ‘ μ†Œμˆ˜μ΄λ‹€.

(좜처 : μœ„ν‚€λ°±κ³Ό)


μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ μ²΄λŠ” 말 κ·ΈλŒ€λ‘œ μ†Œμˆ˜λ₯Ό μ œμ™Έν•œ 수λ₯Ό κ±ΈλŸ¬λ‚΄λŠ” 체이며, λ¬Έμ œμ—μ„œ 주어진 λ²”μœ„λ‚΄μ— μ†Œμˆ˜λ“€λ§Œ λ°”λ‘œ κ±ΈλŸ¬μ€€λ‹€λ©΄ μ‹œκ°„λ³΅μž‘λ„κ°€ ꡉμž₯히 μ€„μ–΄λ“ λ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.
κ°„λ‹¨ν•˜κ²Œ μœ„μ˜ 120κΉŒμ§€ μ†Œμˆ˜μΆœλ ₯ μ•Œκ³ λ¦¬μ¦˜μ„ c++둜 λ§Œλ“€μ–΄λ³Έλ‹€λ©΄,

μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„

#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int era[121];
int main(void) {
    era[0] = 1;
    era[1] = 1;
    for (int i = 2; i < sqrt(120); i++) {
        if (era[i] == 1) continue;
        int cnt = 2;
        while (cnt*i <= 120) {
            era[i*cnt] = 1;
            cnt++;
        }
    }
    for (int i = 1; i <= 120; i++) {
        if (era[i] == 0) cout << i << ' ';
    }
    return 0;
}

μ΄λ ‡κ²Œ λ°°μ—΄μ—μ„œ μ†Œμˆ˜μ˜ λ°°μˆ˜κ°€ λ˜λŠ” μˆ˜λ“€μ€ λͺ¨λ‘ 1둜 λ°”κΏ”μ£Όκ³  λ°°μ—΄μ˜ μˆ˜κ°€ 0인 μˆ˜λ“€μ„ 좜λ ₯ν•˜λ©΄ μ†Œμˆ˜κ°€ 좜λ ₯됨을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ 더 μ‹œκ°„λ³΅μž‘λ„λ₯Ό μ€„μ΄κΈ°μœ„ν•΄ 120이라면 11^2=121이기 떄문에, λ°˜λ³΅λ¬Έμ„ 11κΉŒμ§€λ§Œ λŒλ ΈμŒμ„ 확인할 수 있고, μ΄λŠ” 주어진 λ²”μœ„μ— 따라 math.h의 sqrt()ν•¨μˆ˜λ₯Ό 톡해 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
그러면 λ‹€μ‹œ μ–Έλ”ν”„λΌμž„ 문제둜 λ“€μ–΄κ°€μ„œ, sqrt()와 μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ΄μš©ν•΄ 문제λ₯Ό ν’€μ–΄λ³Έλ‹€λ©΄,

Solution code

#include <iostream>
#include <cmath>
using namespace std;
int era[100001], check[100001], nm1, nm2, cnt1, cnt2, res;;
int main(void) {
    cin >> nm1 >> nm2;
    for (int j = 2; j <= sqrt(nm2); j++) {
        if (check[j] == 0) {
            era[cnt1] = j;
            cnt1++;
            int mul = 2;
            int nm3 = mul * j;
            while (nm3 <= nm2) {
                check[nm3] = 1;
                mul++;
                nm3 = mul * j;
            }
        }
    }
    check[0] = 1;
    check[1] = 1;
    for (int i = nm1; i <= nm2; i++) {
        int nm4 = i;
        int st = 2;
        cnt2 = 0;
        while (nm4 != 1) {
            if (check[st] == 0) {
                if (nm4%st == 0) {
                    nm4 = nm4 / st;
                    cnt2++;
                }
                else st++;
            }
            else st++;
        }
        if (check[cnt2] == 0) res++;
    }
    printf("%d", res);
}

μœ„μ™€ 같이 ν’€μ΄ν•˜λ©΄, 1360ms둜 μ‹œκ°„λ³΅μž‘λ„μ— μœ„λ°°λ˜μ§€μ•Šκ³  μ •λ‹΅μ²˜λ¦¬ 됨을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.