본문 바로가기

Algorithm & Data Structure

백준 - 4948번

728x90
반응형
n=1
while n != 0:
    n = int(input())
    if n == 0:
        break
    sosu = []
    i = n
    t = 2 * n

    for i in range(n, 2 * n):
        check = 0
        if i > 0:
            for k in range(2, i):
                if i % k == 0:
                    check = check + 1
                    break
            if check == 0:
                sosu.append(i)

    print(len(sosu))

이전 소수 계산과 비슷하게 하려 했으나 시간 초과가 떠버렸다. 답은 나올 것이다. 다만 6자리 숫자에서의 효율이 너무 떨어져서 그런 듯하다.

그러나 나에겐 계획이 있지 짝수를 전부 날려버리고 위 과정을 반복하겠다.

 

n=1
while n !=0:
    if n ==0:
        break
    n = int(input())

    sosu = []
    sosu2 = []
    i = n
    t = 2 * n
    for i in range(n+1, t + 1):
        if i % 2 != 0:
            sosu.append(i)
        elif i == 2:
            sosu.append(i)

    z = 0
    x = 2
    for x in sosu:
        check = 0
        if x > 0:
            for k in range(2, x):
                if x % k == 0:
                    check = check + 1
                    break
            if check == 0:
                sosu2.append(x)

    print(len(sosu2))

그렇지만 이 녀석도 실패했다.. 더 효율적인 방법을 찾아보겠다.

 

def sosu(n):
    if n == 1:
        return False
    for i in range(2,int(n**0.5)+1): #2배보다 작아질 수가 없기때문에 1,7배 이런건 존재하지 않는다.
        if n % i == 0:
            return False
    return True

answer = list(range(2,246912))

r = []

for i in answer:
    if sosu(i):
        r.append(i)

n = 1
while 1:
    n = int(input())
    count =0
    if n==0:
        break
    for i in r:
        if n<i<=2*n:
            count = count+1
    print(count)

결국 소수를 찾는 함수를 만들어서 구현하고 문제에서 주어준 범위를 미리 입력해서 답지를 만들어 놨다.

이 얼마나 비효율적인 문제인가..

sosu() 부분을 보면 int(n^0.5+1) 이란 것을 볼 수 있는데 생각해보자.

어떤 자연수 n과 m이 있다고 가정하자 m은 n의 2배, 3배, 4배는 될 수 있지만 소수 판별에서 0.7배 1.3배 이런 소수 배들은 의미가 없다.

따라서 m이 100이면 1~50까지만 나눠보면 해당 수가 소수인지 아닌지 알 수 있다는 것이다.

신박한 아이디어다. 좋다!

728x90
반응형

'Algorithm & Data Structure' 카테고리의 다른 글

DFS & BFS  (0) 2022.01.08
백준 - 2108번  (0) 2022.01.07
백준 - 1002번  (0) 2021.12.23
백준 - 2581번  (0) 2021.12.21
백준 - 1011번  (0) 2021.12.20