😊 λ°±μ€€ 1929 : μ†Œμˆ˜ κ΅¬ν•˜κΈ°

3JuhwanΒ·2021λ…„ 2μ›” 26일
0

Algorithm

λͺ©λ‘ 보기
10/23

1929: μ†Œμˆ˜ κ΅¬ν•˜κΈ°

이전에 λͺ» ν‘Ό 문제 λ‹€μ‹œ ν’€μ—ˆλ‹€..


πŸ“Œ Try 1

import sys

M, N = map(int, sys.stdin.readline().split())
table = list(range(2, N + 1))

i = 0
while i*i <= N:
    j = 2
    while table[i] * j <= N:
        rem = table[i] * j
        if rem in table:
            table.remove(rem)
        j += 1
    i += 1

for x in table:
    if x >= M:
        print(x)

μ‹œκ°„ μ œν•œμ΄ 2μ΄ˆλΌμ„œ 일반적으둜 μ†Œμˆ˜ κ΅¬ν•˜λŠ” λ°©λ²•μœΌλ‘  μ•ˆ 될 거라 μƒκ°ν•΄μ„œ κ²€μƒ‰ν•΄λ³΄λ‹ˆ, μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ μ²΄λΌλŠ” κ°œλ…μ΄ μžˆμ—ˆλ‹€.

이 κ°œλ…μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•œ 건데, 이게 μ‹œκ°„μ΄ˆκ³ΌλΌμ„œ λ‹Ήν™©ν–ˆλ‹€.


πŸ“Œ Try 2

import sys

def delete(first, step):
    if first + step > len(table) - 1:
        return 0
    table[first + step] = 0
    delete(first + step, step)

# input
M, N = map(int, sys.stdin.readline().split())
table, first = [1] * (N + 1), 2

# process
while first * first <= N:
    delete(first, first)
    first += 1

# output
for i in range(M, N + 1):
    if table[i]:
        print(i)

μ΄λ²ˆμ—λ„ μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체을 μž¬κ·€λ‘œ κ΅¬ν˜„ν–ˆλ‹€.

ν•˜μ§€λ§Œ 이 μ½”λ“œλŠ” λŸ°νƒ€μž„ μ—λŸ¬ (RecursionError)κ°€ λ–΄λ‹€.

python은 μž¬κ·€ depthκ°€ 3000인데 이걸 λ„˜κ²¨μ„œ μœ„μ˜ 였λ₯˜κ°€ 뜬 λͺ¨μ–‘이닀.


πŸ“Œ Try 3

n, m = map(int, input().split())

for x in range(n, m+1):
	flag = 0
	for i in range(2, x//2+1):
		if x % i == 0:
			flag += 1
			break
	if not flag:
		print(x)

λ‹€λ₯Έ λΆ„ λΈ”λ‘œκ·Έ μ½”λ“œλ₯Ό ν›‘μ–΄λ³΄λ‹ˆ, 일반적인 λ°©λ²•μœΌλ‘œ μž‘μ„±ν•œ μ½”λ“œκ°€μ‹œκ°„μ΄ˆκ³Ό λœ¨μ§€ μ•Šμ•˜λ‹€.

κ·Έλž˜μ„œ 일반적인 λ°©λ²•μœΌλ‘œ μ†Œμˆ˜λ₯Ό κ΅¬ν•΄λ΄€λŠ”λ°, μ΄λ²ˆμ—λ„ μ‹œκ°„μ΄ˆκ³Ό λ–΄λ‹€.

γ…Ž ㅏ...


πŸ“Œ Try 4

import sys

sys.setrecursionlimit(10000000)

def delete(first, step):
    if first + step > len(table) - 1:
        return 0
    table[first + step] = 0
    delete(first + step, step)

# input
M, N = map(int, sys.stdin.readline().split())
table, first = [1] * (N + 1), 2
table[1] = 0

# process
while first * first <= N:
    delete(first, first)
    first += 1

# output
for i in range(M, N + 1):
    if table[i]:
        print(i)

ν•˜λ„ μ•ˆ ν’€λ €μ„œ πŸ“Œ Try 2의 μž¬κ·€ μ½”λ“œμ— depth limit을 10000000으둜 λŠ˜λ Έλ‹€. κ·Έλž¬λ”λ‹ˆ, λ§žμ•˜μŠ΅λ‹ˆλ‹€!!κ°€ 뜨긴 ν–ˆλ‹€.

ν•˜μ§€λ§Œ 개운치 μ•Šμ€ λŠλ‚Œ..


🎯 Solution

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

M, N = map(int, input().split())

for i in range(M, N+1):
    if isPrime(i):
        print(i)

λ‹€λ₯Έ λΆ„ μ½”λ“œλ₯Ό κ°€μ Έμ™”λ‹€.
이 μ½”λ“œλŠ” μ†Œμˆ˜λ₯Ό νŒλ³„ν•˜λŠ” κ°€μž₯ 일반적인 λ°©λ²•μœΌλ‘œ μž‘μ„±λλ‹€.

μ•„λž˜μ™€ 같은 λ‚΄μš©μ„ 배울 수 μžˆμ—ˆλ‹€.

if num == 1:
	return False

1λΆ€ν„° νŒλ³„ν•΄μ•Ό ν•˜λŠ” μ˜ˆμ™Έμ μΈ 상황일 λ•Œλ₯Ό λŒ€λΉ„ν•œ μ½”λ“œ

int(num**0.5)

μ–΄λ–€ 수의 루트λ₯Ό math 라이브러리 없이도 이런 λ°©λ²•μœΌλ‘œ ꡬ할 수 μžˆλ‹€.


🎁 Reference

profile
Codeforces와 USACO 풀이λ₯Ό κΈ°λ‘ν•©λ‹ˆλ‹€. 이전 글도 계속 μ—…λ°μ΄νŠΈ λ©λ‹ˆλ‹€.

0개의 λŒ“κΈ€