๐ Problem
https://www.acmicpc.net/problem/1929
1929๋ฒ: ์์ ๊ตฌํ๊ธฐ
์ฒซ์งธ ์ค์ ์์ฐ์ M๊ณผ N์ด ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. (1 ≤ M ≤ N ≤ 1,000,000) M์ด์ N์ดํ์ ์์๊ฐ ํ๋ ์ด์ ์๋ ์ ๋ ฅ๋ง ์ฃผ์ด์ง๋ค.
www.acmicpc.net
๐ Submission Code
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ ๋, 1๊ฐ์ง ๋ฐฉ์์ผ๋ก๋ง ์ ๊ทผํ๊ธฐ๋ณด๋ค๋ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผํ๋ ์ต๊ด์ ๊ฐ์ง์๐๐ป
# case 1
'''์๋ผํ ์คํ
๋ค์ค์ ์ฒด ํ์ฉํ๊ธฐ : ์๊ฐ์ ์ค์ด๊ธฐ ์ํด์ ๋ฃจํธํ ๋ถ๋ถ๊น์ง๋ง for ๋ฐ๋ณต๋ฌธ'''
import sys
M, N = map(int, sys.stdin.readline().split())
prime_num = []
for i in range(M, N+1):
condition = True
if i == 1 : continue
for j in range(2, int(i**0.5) + 1):
if i % j == 0:
condition = False
break
if condition:
prime_num.append(i)
print(*prime_num, sep='\n')
# case 2
'''์๋ผํ ์คํ
๋ค์ค์ ์ฒด ํ์ฉํ๊ธฐ: ์ฌ์ฉ์์ ์ํจ์ ๋ง๋ค์ด์ ํ์ดํ๊ธฐ'''
import sys
M, N = map(int, sys.stdin.readline().split())
def check_prime(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
for i in range(M, N + 1):
if check_prime(i):
print(i)
๐ Solution
์์๋ฅผ ํ๋ณํ๋ ๋ฌธ์ ๋ ์๋ ์ ๋ฐฑ์ค 1978๋ฒ [์์์ฐพ๊ธฐ]๋ฅผ ํตํด ๋ง๋ ์ ์ด ์์๊ธฐ์, ๋น์ทํ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ฉด ๋ ๊ฒ์ด๋ผ ์๊ฐ์ ํ๋ค.
์ต์ด์ ์์ฑํ ์ฝ๋๋ ์๋์ ๊ฐ๋ค. ํ์ง๋ง ๋ชจ๋ ์๋ฅผ ๋ฐ๋ณต๋ฌธ์ ํตํด ํ์ธ์ ํด์์ธ์ง ์๊ฐ ์ด๊ณผ.
๋น์ฐํ ์๋ ๊ฒ์ด๋ผ ์๊ฐ์ ํ์ง๋ง, ํน์๋ sys๋ฅผ importํด์ ๋ฐ๊ฟ๋ณด์์ง๋ง ๋์ผํ๊ฒ ์๊ฐ์ด๊ณผ. for ๋ฐ๋ณต๋ฌธ์ด ๋ฌธ์ ๋ค!
'''์ฒซ๋ฒ์งธ ํ์ด - ์๊ฐ์ด๊ณผ'''
M, N = map(int, input().split())
prime_num = []
for i in range(M, N+1):
condition = True
if i == 1 : continue
for j in range(2, i):
if i % j == 0:
condition = False
break
if condition:
prime_num.append(i)
print(*prime_num, sep='\n')
'''๋๋ฒ์งธ ํ์ด - ํน์๋ํด์ sys๋ก ํด๋ดค์ง๋ง, ๋์ผํ๊ฒ ์๊ฐ์ด๊ณผ. for๋ฌธ์ ๊ณ ์ณ์ผํ ๊ฒ ๊ฐ๋ค.'''
import sys
M, N = map(int, sys.stdin.readline().split())
prime_num = []
for i in range(M, N+1):
condition = True
if i == 1 : continue
for j in range(2, i):
if i % j == 0:
condition = False
break
if condition:
prime_num.append(i)
print(*prime_num, sep='\n')
๐ how to overcome
์๊ฐ ์ด๊ณผ๋ฅผ ๊ทน๋ณตํ ๋ฐฉ๋ฒ์ '์๋ผํ ์คํ ๋ค์ค์ ์ฒด'์ด๋ค. ์ฝ๋์ ๋ํ ์ค๋ช ์ ๋จผ์ ํ ๋ค์ ๊ฐ๋ ์ ์๋์์ ์์๋ณด์.
'''์๋ผํ ์คํ
๋ค์ค์ ์ฒด ํ์ฉํ๊ธฐ : ์๊ฐ์ ์ค์ด๊ธฐ ์ํด์ ๋ฃจํธํ ๋ถ๋ถ๊น์ง๋ง for ๋ฐ๋ณต๋ฌธ'''
# case 1
# ์
๋ ฅ ๋ฐ๊ธฐ
import sys
M, N = map(int, sys.stdin.readline().split())
# ์์ ๋น ๋ฆฌ์คํธ ์์ฑ
prime_num = []
# M๋ถํฐ N๊น์ง for๋ฌธ์ ํ์ ํ๋ฉด์ ํ๋์ฉ ์๊ฐ ์์์ธ์ง ํ์ธ
for i in range(M, N+1):
condition = True
# 1์ ์์๊ฐ ์๋
if i == 1 : continue
# 2์ด์ ๋ถํฐ ์ด์ค for๋ฌธ์ผ๋ก 2๋ถํฐ ํด๋น ์๊น์ง ๋ฐ๋ณต๋ฌธ์ ๋๋ ค 0์ผ๋ก ๋๋์ด๋จ์ด์ง๋์ง ํ์ธ
# ๋๋์ด ๋จ์ด์ง๋ฉด ์์๊ฐ ์๋๋ฏ๋ก ๋ฐ๋ก break
for j in range(2, int(i**0.5) + 1):
if i % j == 0:
condition = False
break
# ์ด์ค for๋ฌธ์ ๋ค ๋๊ณ ๋์ค๋ฉด, 0์ผ๋ก ๋๋์ด๋จ์ด์ง๋ ์๊ฐ ์๋ค๋ ์๋ฏธ
# ์ฆ condition(์กฐ๊ฑด)์ด True์ด๋ฏ๋ก ์์๋ฆฌ์คํธ์ ์ถ๊ฐ
if condition:
prime_num.append(i)
# ๋ฆฌ์คํธ unpacking & ๊ตฌ๋ถ์๋ก ์ค๋ฐ๊ฟ์ ๋ฃ๊ณ ์ถ๋ ฅ
print(*prime_num, sep='\n')
'''์๋ผํ ์คํ
๋ค์ค์ ์ฒด ํ์ฉํ๊ธฐ: ์ฌ์ฉ์์ ์ํจ์ ๋ง๋ค์ด์ ํ์ดํ๊ธฐ'''
# case 2
# ์์ ์๋ผํ ์คํ
๋ค์ค์ ์ฒด ํ์ฉํ๊ธฐ(case1) ํ์ด์ ๋์ผํ๋ฐ, ์ฌ์ฉ์ ์ ์ํจ์๋ฅผ ๋ง๋ค์ด์ ํ์ดํ๋ค๋ ๊ฒ๋ง ์ฐจ์ด๊ฐ ์๋ค.
# ๊ตณ์ด ์์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ง์๊ณ , ๋ฐ๋ก ํ์ธ ํ ์ถ๋ ฅํ๊ธฐ๋๋ฌธ์ ์ธ๋ฒ์งธ ํ์ด๋ณด๋ค ์๊ฐ์ด ๋ ์ ๊ฒ ๊ฑธ๋ฆฐ๋ค.
import sys
M, N = map(int, sys.stdin.readline().split())
def check_prime(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
for i in range(M, N + 1):
if check_prime(i):
print(i)
๐ฅ range์์ ์ ๋ฒ์๋ฅผ $\sqrt{}$(๋ฃจํธ)๋ก ์ค์ด๋ ๊ฑด์ง
์๋์ ์์๋ฅผ ๋ณด๋ฉด ๊ฐ๊ฐ $n$์ด $12$, $100$์ผ ๋, ์ ์ฒด๋ฅผ ๋ค ํ์ธํ๋ ๊ฒ์ด ์๋๋ผ $\sqrt{12}$, $\sqrt{100}$ ์ฆ, $2\sqrt{3}$, $10$ ๋งํผ๋ง ํ์ธ์ ํ๋ฉด ์ ์ฒด ์์๋ฅผ ํ์ธํ ์ ์๋ค.๐ก
์ฐธ๊ณ ๋ก ๋ฌธ์ ๋ฅผ ์ฐฌ์ฐฌํ ์ฝ์ด๋ณด๋ฉด, ํ๋จ์ ๋ฌธ์ ์ ๋ํ ๋ถ๋ฅ๊ฐ ์๋ด๋์ด์๋๋ฐ ํด๋น ๋ฌธ์ ๋ ์๋์ ๋ถ๋ฅ๋ฅผ ๊ฐ์ง๊ณ ์์๋ค.
์๋์ Note์์ ์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ฅผ ์์๋ณด์๐
- ์ํ
- ์ ์๋ก
- ์์ ํ์
- ์๋ผํ ์คํ ๋ค์ค์ ์ฒด
๐ Note
๐ ์๋ผํ ์คํ ๋ค์ค์ ์ฒด
- ์๋ผํ ์คํ ๋ค์ค์ ์ฒด ์ํค๋ฐฑ๊ณผ
- ์ํ์์ ์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ ์์๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ
๐ฅ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉ
- ์์ ํ๋ณ ์๊ณ ๋ฆฌ์ฆ์ ์๋๋ฅผ ๋์ด๋ ๊ฐ์ฅ ๋ํ์ ์ธ ๋ฐฉ๋ฒ
- ๊ฒ์ฆํ๊ณ ์ ํ๋ ์์ ์ ๊ณฑ๊ทผ๊น์ง๋ง์ ๊ฒ์ฆํด ์์์ธ์ง ํ๋ณํ์ฌ, ๋๋์ ์์๋ฅผ ํ๋ฒ์ ํ๋ณํ ๋ ์๋๊ฐ ๋นจ๋ผ ์ ์ฉํจ
๐ ์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ฅผ ํ์ฉํ๋ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ : ์์์ ๊ฐ์ ๊ตฌํ๊ธฐ
'''์๋ผํ ์คํ
๋ค์ค์ ์ฒด ํ์ฉํ๊ธฐ : N๊น์ง์ ์์์ ๊ฐ์ ๊ตฌํ๊ธฐ'''
# case 1
def solution(N):
# ์์์ ๋ํ ์์ธ์ฒ๋ฆฌ
if N <= 0: raise ValueError("Not Allow Zero and Negative Number")
# ์์ ํ์ธ ํ
์ด๋ธ : True๊ฐ N+1๊ฐ ์์๋ก ๋ด๊ธด list, 0๋ถํฐ๋ผ์ +1์ ํด์ค๋ค
primenum_check = [True]*(N+1)
# 0๊ณผ 1์ ์์๊ฐ ์๋ : 0, 1๋ฒ์งธ ๋ฆฌ์คํธ๋ False๋ก ๋ฐ๊ฟ์ค๋ค
primenum_check[0] = False
primenum_check[1] = False
# ์๋ผํ ์คํ
๋ค์ค์ ์ฒด
for i in range(2, int(N**0.5)+1):
# ๋จผ์ False๋ก ๋ฐ๊ฟ์ค 0๊ณผ 1์ ์ ์ธํ๊ณ ํ์ธ
if primenum_check[i] == True:
# ๋ฐฐ์๋ ๋ค False๋ก ๋ฐ๊ฟ์ค๋ค
for j in range(2*i, N+1, i):
# print("i:", i,"j:", j)
primenum_check[j] = False
return sum(primenum_check)
# ----------------------------------------------------------------------
# case 2 : enumerate ํ์ฉํ๊ธฐ
def solution(N):
pass
if N <= 0:
raise ValueError
# True == 1, False == 0 : case2์ ๋ง์ฐฌ๊ฐ์ง๋ก True์ธ ๋ฆฌ์คํธ ๋ง๋ค์ด์ฃผ๊ณ 1๊ณผ 0์ False๋ก ๋ฐ๊ฟ์ค๋ค
prime_list = [1] * (N + 1)
prime_list[0], prime_list[1] = 0, 0
# enumerate๋ก ๋ฒํธ(์์, ์ซ์), ์์(1 or 0)๋ฅผ ๊ฐ์ด ๋ฐ๋๋ค
for prime_number, v in enumerate(prime_list):
# print(prime_list)
if v: # ์์์ด๋ฉด(True(=1)์ด๋ฉด)
# (ํด๋น์์ + 1)๋ถํฐ (๋ง์ง๋ง ์)๊น์ง ๋๋ฉด์ ๋๋์ด์ง๋์ง ํ์ธํ๋ค
for i in range(prime_number + 1, N + 1):
# print("i: ", i)
if i % prime_number == 0: # ์์์ ๋ฐฐ์์ด๋ฉด
prime_list[i] = 0 # ์์๊ฐ ์๋๋ค -> (0 == False)๋ก ๋ฐ๊ฟ์ค๋ค
# print("prime list: ", prime_list)
return sum(prime_list)
print(solution(10))
๐ฅ case 1์์ range(2*$i$, $N$+1, $i$) ์ด์ ์ ๋ํ ๋ถ๊ฐ ์ค๋ช
์๋ฅด์คํ ํ ๋ ์ค์ ์ฒด์ ๋ฒ์น์ ๋ฐ๋ผ,
2์ผ๋ก ๋๋์ด์ง๋ฉด 2์ ๋ฐฐ์์ธ 4, 6, 8, 10, 12 ๋ฑ๋ ์์์์ ์ ์ธ๊ฐ ๋๊ณ ,
3์ผ๋ก ๋๋์ด์ง๋ฉด 3์ ๋ฐฐ์์ธ 6, 9, 12, 15 ๋ฑ๋ ์์์์ ์ ์ธ๊ฐ ๋๋ค.
ํด๋น ๋ฒ์น์ ๊ทธ๋๋ก ์ ์ฉํ์ฌ $i = 2, 3, 4, ...$ ์ด๊ณ , $j = 2, 3, 4, ...$์ ๋ฐฐ์ ์ด๋ค.
์ฝ๋ ์ค๊ฐ์ print
๋ฌธ์ ๋ฃ์ด์ ํ์ธ์ ํด๋ณด๋ฉด ์๋์ ๊ฐ์์ ์ ์ ์๋ค. (solution(10)
์ ๋ฃ์ ์์)
$10$ ์ดํ์ ์์๋ $2, 3, 5, 7$๋ก $4(True)$๊ฐ์ด๋ค
๐ Reference
- ์ํค๋ฐฑ๊ณผ : ์๋ผํ ์คํ ๋ค์ค์ ์ฒด
- ์ฒซ๋ฒ์งธ ์ด๋ฏธ์ง ์ถ์ฒ
- ๊ฐ์ธ ๊นํ๋ธ์๋ ipynb ํ์ผ๋ก ์ ๋ฆฌํ๊ณ ์์ต๋๋ค. ๐
GitHub - imdona/daily-commit
Contribute to imdona/daily-commit development by creating an account on GitHub.
github.com