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

[λ°±μ€€] 1978번: μ†Œμˆ˜ μ°ΎκΈ° - C++ λ³Έλ¬Έ

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

[λ°±μ€€] 1978번: μ†Œμˆ˜ μ°ΎκΈ° - C++

.23 2021. 8. 17. 03:36
문제

주어진 수 N개 μ€‘μ—μ„œ μ†Œμˆ˜κ°€ λͺ‡ κ°œμΈμ§€ μ°Ύμ•„μ„œ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫 쀄에 수의 개수 N이 주어진닀. N은 100μ΄ν•˜μ΄λ‹€. λ‹€μŒμœΌλ‘œ N개의 μˆ˜κ°€ μ£Όμ–΄μ§€λŠ”λ° μˆ˜λŠ” 1,000 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.

 

좜λ ₯

주어진 μˆ˜λ“€ 쀑 μ†Œμˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.


μ†Œμˆ˜λ₯Ό μ°ΎλŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•˜μ—¬ ν’€ 수 μžˆλŠ” 문제.

μ†Œμˆ˜λŠ” 1보닀 큰 μžμ—°μˆ˜ 쀑 1κ³Ό 자기 μžμ‹ λ§Œμ„ μ•½μˆ˜λ‘œ κ°–λŠ” μžμ—°μˆ˜λ₯Ό μ˜λ―Έν•œλ‹€. 2, 3, 5, 7, 11 .. λ“±μ˜ μžμ—°μˆ˜κ°€ μ†Œμˆ˜λ‘œ μ†ν•œλ‹€.

 

첫번째둜 κ°€μž₯ 기본적인 μ†Œμˆ˜λ₯Ό μ°ΎλŠ” 방법은 2λΆ€ν„° NκΉŒμ§€μ˜ 수λ₯Ό μ‘°μ‚¬ν•˜λŠ” 방법이닀. 2λΆ€ν„° NκΉŒμ§€μ˜ 수 i둜 N을 λ‚˜λˆ λ³΄λ©΄μ„œ λ‚˜λ¨Έμ§€κ°€ 0이 λ‚˜μ˜€λŠ”μ§€ νŒλ³„ν•˜λŠ” 것이닀. 2λΆ€ν„° NκΉŒμ§€ λͺ¨λ“  경우의 수λ₯Ό 계산해보기 λ•Œλ¬Έμ— μ‹œκ°„λ³΅μž‘λ„λŠ” O(N)이 λ‚˜μ˜¨λ‹€.

bool isPrime(int N) {
    if(N <= 1) return false; // 1은 μ†Œμˆ˜κ°€ μ•„λ‹˜
    for(int i = 2; i < N; i++) {
    	if(i % N == 0) return false; // ν•˜λ‚˜λΌλ„ λ‚˜λˆ λ–¨μ–΄μ§€λŠ” μˆ˜κ°€ μžˆμ„ 경우 μ†Œμˆ˜κ°€ μ•„λ‹˜
    }
	return true;
}

 

λ‘λ²ˆμ§Έ 방법은 2λΆ€ν„° √NκΉŒμ§€μ˜ 수만 μ‘°μ‚¬ν•˜λŠ” 방법이닀. 첫번째 방법과 거의 λ™μΌν•œλ°, λ²”μœ„λ§Œ 달라진닀.

36을 예둜 λ“€λ©΄, 36의 μ•½μˆ˜λŠ” 1, 2, 3, 4, 6, 9, 12, 18, 36이닀. μ—¬κΈ°μ„œ √36 = 6 을 κΈ°μ€€μœΌλ‘œ 1 * 36, 2 * 18, 3 * 12, 4 * 9 처럼 κ³±ν•˜λŠ” μˆ˜λ“€μ΄ λŒ€μΉ­μ„ 이루기 λ•Œλ¬Έμ— κ·Έ μ΄μƒμ˜ 수λ₯Ό κ²€μ‚¬ν•˜λŠ” 것은 μ˜λ―Έκ°€ μ—†μ–΄ μ œκ³±κ·ΌκΉŒμ§€μ˜ 수만 κ²€μ‚¬ν•˜λ©΄ λœλ‹€. μ‹œκ°„λ³΅μž‘λ„κ°€ O(√N)으둜 μœ„μ˜ κ²½μš°λ³΄λ‹€ 효율적인 νŽΈμ΄λ‹€.

bool isPrime(int N) {
    if(N <= 1) return false; // 1은 μ†Œμˆ˜κ°€ μ•„λ‹˜
    for(int i = 2; i * i =< N; i++) {
    	if(i % N == 0) return false; // ν•˜λ‚˜λΌλ„ λ‚˜λˆ λ–¨μ–΄μ§€λŠ” μˆ˜κ°€ μžˆμ„ 경우 μ†Œμˆ˜κ°€ μ•„λ‹˜
    }
	return true;
}

제곱근의 μ²˜λ¦¬κ°€ 번거둭기 λ•Œλ¬Έμ— i * i <= Nκ³Ό 같은 λ°©λ²•μœΌλ‘œ λ²”μœ„λ₯Ό 지정해쀀닀.

 

λ‘λ²ˆμ§Έ λ°©λ²•μœΌλ‘œ ν’€μ΄ν•˜μ˜€μœΌλ‚˜, λ‘˜ 쀑 μ–΄λŠ λ°©λ²•μœΌλ‘œ 풀어도 상관없닀.

 

μ½”λ“œ
#include <cstdio>
#include <vector>

using namespace std;

bool IsPrime(int num);

int main(void) {
    int n;
    scanf("%d", &n);
    
    int result = 0;
    for(int i = 0; i < n; i++) {
        int temp;
        scanf("%d", &temp);
        if(IsPrime(temp)) result++;
    }

    printf("%d\n", result);
    return 0;
}

bool IsPrime(int num) {
    if(num <= 1) return false;
    for(int i = 2; i * i <= num; i++) {
        if(num % i == 0)
            return false;
    }
    return true;
}
Comments