Eat the ENAK

BOJ1929 - 소수 구하기 본문

PS: Problem Solving/BOJ: 백준온라인저지

BOJ1929 - 소수 구하기

으낙 2019. 10. 29. 11:58

문제 바로가기

https://www.acmicpc.net/problem/1929

Solved.ac* 난이도

* Solved.ac는 백준 온라인 저지의 문제들에 난이도를 매겨주는 서비스입니다. 자세한 내용은 홈페이지를 참고해주세요.

 


본문


해설

https://github.com/return0927/CodingWrite-UP/blob/master/BOJ/1929/1929.py

 

소수 구하는 알고리즘만 간단히 설명하자면

def check_prime(n: int) -> bool:
    if n == 1:
        return False
    for i in range(2, int(n**.5 + .5) + 1):
        if n % i == 0:
            return False
    return True

이다.

주어진 수가 1인 경우에는 소수가 아니라고 판단한다 (이 부분에는 논란이 있을 수 있으나 다른 문제에서도 아닌걸로 처리되었다)

그리고 소수판별은 아주 조금만 생각을 해도 \(O(\sqrt{n})\)만에 처리할 수 있음을 알 수 있다. 왜냐하면 16를 예로 들자면 \(\sqrt{16}=4\)인데, 4으로 나누었을 때 그 몫이 4이고, 그 이후의 약수가 존재하려면 이미 그 전에 16에서 그 이후의 약수를 나눈 몫이 앞에 있었어야한다. 따라서 그 뒤는 자동으로 결정되기 때문에 검사할 필요가 없다.

 

range(2, int(n**.5 + .5) + 1)

그래서 검사할 범위를 보자면 뭔가 난해할 수도 있다. \(\sqrt{n} + 0.5\)에서 0.5를 더해준 이유는 int로 cast하면서 반올림을 하는 기법이다. 뒤로 한 개를 더 체크한다고 크게 시간적인 면에서 버거울 것이 없기 때문에 하나정도는 더 여유있게 체크해줘도 나쁘지 않다

 

'PS: Problem Solving > BOJ: 백준온라인저지' 카테고리의 다른 글

BOJ1978 - 소수 찾기  (0) 2019.10.29
BOJ2581 - 소수  (0) 2019.10.29
BOJ1085 - 직사각형에서 탈출  (0) 2019.10.29
BOJ3009 - 네 번째 점  (0) 2019.10.29
BOJ4153 - 직각삼각형  (0) 2019.10.28
Comments