barcode

백준 4134번 풀이

BOJ/[BOJ] Python

문제

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

 

4134번: 다음 소수

정수 n(0 ≤ n ≤ 4*109)가 주어졌을 때, n보다 크거나 같은 소수 중 가장 작은 소수 찾는 프로그램을 작성하시오.

www.acmicpc.net

주어진 숫자보다 같거나 큰 소수를 출력하시오. (예: 6->7)

 

풀이

이 문제를 풀기 위해서는 필요한 게 하나 있다.

def isprime(a):
    sqrt = int(a ** 0.5)
    if a == 1: 
        return False
    for i in range(2,sqrt+1):
        if a % i == 0:
            return False
    else: 
        return True

바로 에라토스테네스의 체를 예전에 백준 푼다고 루트 N 버전으로 코딩한게 그것. 근데 저거 저대로 쓰면 틀리고요… 내 경험담임 님들은 한방에 맞추십셔…

 

def isprime(a):
    sqrt = int(a ** 0.5)
    if a < 2: 
        return False
    for i in range(2,sqrt+1):
        if a % i == 0:
            return False
    else: 
        return True

아무튼 0이랑 1은 애초에 소수고 나바리고 못 매기니까 걍 예외처리 합시다.

 

K = int(sys.stdin.readline())

for i in range(K):
    T = int(sys.stdin.readline())
    while isprime(T) == False:
        T += 1
    print(T)

우리 늘 그래왔듯이… 입력은 쉽다. 로직이 문제지… 근데 문제를 보면 주어진 수보다 '같거나 큰' 소수를 출력하라고 되어 있다. 그래서 체 갖고왔잖아요? 그리고 같거나 큰 소수를 찾기 위해 저 체를 쓸 거다. 같거나 큰 소수가 나올때까지 뺑뺑이를 돌려야 하니 반복문으로 While이 온 거고. 여기까지 이해 되셨죠?

 

isprime()에 소수를 넣었을때는 True, 합성수를 넣었을때는 False가 나온다. 그럼 왜 While문에 저런 조건이 붙었는지도 이해할 수 있다. False 떴으면 합성수니까 1을 더해서 소수 나올때까지 반복문 뺑뺑이 돌라는 얘기. 쉽죠?

 

import sys

def isprime(a):
    sqrt = int(a ** 0.5)
    if a < 2: 
        return False
    for i in range(2,sqrt+1):
        if a % i == 0:
            return False
    else: 
        return True
    
K = int(sys.stdin.readline())

for i in range(K):
    T = int(sys.stdin.readline())
    while isprime(T) == False:
        T += 1
    print(T)

그래서 이거 내고 맞았다. 

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 17103번 풀이  (0) 2024.04.13
백준 2485번 풀이  (0) 2024.02.26
백준 1735번 풀이  (0) 2024.02.25
백준 13241번 풀이  (0) 2024.02.10
백준 11478번 풀이  (0) 2023.12.10