[BOJ][๐ก3][๋ฐฑ์ค#01644] ์์์ ์ฐ์ํฉ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold III
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
ํ๋ ์ด์์ ์ฐ์๋ ์์์ ํฉ์ผ๋ก ๋ํ๋ผ ์ ์๋ ์์ฐ์๋ค์ด ์๋ค. ๋ช ๊ฐ์ง ์์ฐ์์ ์๋ฅผ ๋ค์ด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
3 : 3 (ํ ๊ฐ์ง) 41 : 2+3+5+7+11+13 = 11+13+17 = 41 (์ธ ๊ฐ์ง) 53 : 5+7+11+13+17 = 53 (๋ ๊ฐ์ง)
ํ์ง๋ง ์ฐ์๋ ์์์ ํฉ์ผ๋ก ๋ํ๋ผ ์ ์๋ ์์ฐ์๋ค๋ ์๋๋ฐ, 20์ด ๊ทธ ์์ด๋ค. 7+13์ ๊ณ์ฐํ๋ฉด 20์ด ๋๊ธฐ๋ ํ๋ 7๊ณผ 13์ด ์ฐ์์ด ์๋๊ธฐ์ ์ ํฉํ ํํ์ด ์๋๋ค. ๋ํ ํ ์์๋ ๋ฐ๋์ ํ ๋ฒ๋ง ๋ง์ ์ ์ฌ์ฉ๋ ์ ์๊ธฐ ๋๋ฌธ์, 3+5+5+7๊ณผ ๊ฐ์ ํํ๋ ์ ํฉํ์ง ์๋ค. ์์ฐ์๊ฐ ์ฃผ์ด์ก์ ๋, ์ด ์์ฐ์๋ฅผ ์ฐ์๋ ์์์ ํฉ์ผ๋ก ๋ํ๋ผ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์์ฐ์ N์ด ์ฃผ์ด์ง๋ค. (1 โค N โค 4,000,000)
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์์ฐ์ N์ ์ฐ์๋ ์์์ ํฉ์ผ๋ก ๋ํ๋ผ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์
์์ 1
์ ๋ ฅ
20
์ถ๋ ฅ
0
์์ 2
์ ๋ ฅ
3
์ถ๋ ฅ
1
์์ 3
์ ๋ ฅ
41
์ถ๋ ฅ
3
์์ 4
์ ๋ ฅ
53
์ถ๋ ฅ
2
My Sol
import sys
input = sys.stdin.readline
def is_prime(M):
if M <= 10:
return base_primes[M]
for i in range(2, int(M ** (1 / 2)) + 1):
if not M % i: return 0
return 1
def next_prime(M):
while not is_prime(M):
M += 1
return M
def make_primes(M):
l = 0
arr = [1] * M
primes = []
for i in range(2, int(M ** (1 / 2)) + 1):
if arr[i]:
l += 1
primes.append(i)
for j in range(i * 2, M, i):
arr[j] = 0
for i in range(int(M ** (1 / 2)) + 1, M):
if arr[i]:
l += 1
primes.append(i)
return primes, l
base_primes = [0, 0, 1, 1, 0, 1, 0, 1, 0, 0 ,0]
M = int(input())
primes, l = make_primes(M)
primes.append(next_prime(M))
l += 1
accs = [0]
for p in primes:
accs.append(accs[-1]+p)
def main(N):
s, e = 0, 1
cnt = 0
while e <= l:
if s >= e:
e += 1
continue
diff = accs[e] - accs[s]
# ๋์ ํฉ์ด N๋ณด๋ค ์์ ๊ฒฝ์ฐ
if diff < N:
e += 1
# ๋์ ํฉ์ด N๋ณด๋ค ํฐ ๊ฒฝ์ฐ
elif diff > N:
s += 1
# ๋์ ํฉ์ด N์ธ ๊ฒฝ์ฐ
else:
cnt += 1
e += 1
s += 1
return cnt
cnt = main(M)
if is_prime(M) and primes and primes[-1] < M:
cnt += 1
print(cnt)
์์ ํ์ ๊ณผ ํฌํฌ์ธํฐ๋ฅผ ์ตํฉํ๋ ๋ฌธ์ ์๋ค. ์ฐ์ ์๋ผํ ์คํ ๋ค์ค์ ์ฒด ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด ์์๋ฅผ ํ์ ํ๋๋ฐ, ์ ๋ ฅ๋ ์ M๊น์ง ์์ํ์ ์ ๋ชจ๋ ํด์ฃผ์๋ค.
next_prime ํจ์๋ฅผ ์ด์ฉํด M ์ดํ์ ์์ ํ๋๊น์ง ์์๋ฆฌ์คํธ์ ์ถ๊ฐํ ๊ฒ์ M์ ๋๊ธด ์ฒซ ์์๊ฐ ์ด์ ์์์์ ํฉ์ด M์ด ๋๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ ๊ฒ์ด๋ค.
์ด ์์ ๋ฆฌ์คํธ๊ฐ ์์ฑ๋๋ฉด, accs ๋ผ๋ ์์ ๋์ ํฉ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ , ์์ ์ธ๋ฑ์ค์ ๋ ์ธ๋ฑ์ค๋ฅผ ๋๋์ด ํฌํฌ์ธํธ๋ฅผ ๋๋ฆฌ๋ฉฐ ๊ฐ์ ์ฐจ๋ฅผ M๊ณผ ๋น๊ตํ๋ฉฐ ํฌ์ธํฐ๋ฅผ ์ฎ๊ฒจ์ฃผ๋ฉด ๋๋ค.
์ดํ M ์์ฒด๊ฐ ์์์ด๋ฉฐ, ์์ ๋ฆฌ์คํธ์ ๋ง์ง๋ง ๊ฐ์ด M๋ณด๋ค ์์ ๊ฒฝ์ฐ์ cnt๋ฅผ 1 ์ถ๊ฐํด์ค๋ค. ์๋ํ๋ฉด ๊ทธ ์์ ํ๋ ์์ฒด๊ฐ ์นด์ดํธ๊ฐ ๋๊ธฐ ๋๋ฌธ
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
import sys
num = int(sys.stdin.readline())
def range_prime(n):
m = int(n ** 0.5) + 1
s = [1] * (n + 1)
for i in range(2,m):
if s[i] == 1:
for j in range(i + i,n + 1,i):
s[j] = 0
return [i for i in range(2,n + 1) if s[i] == 1]
left, answer, acc = 0, 0, 0
lst = range_prime(num)
for i in range(len(lst)):
acc += lst[i]
if acc == num:
answer += 1
elif acc > num:
while acc > num:
acc -= lst[left]
left += 1
if acc == num:
answer += 1
print(answer)
์ฐ์ฐ์๊ฐ์ ๋๋ณด๋ค ์ํญ ๊ธธ์ง๋ง, ๋ฌธ์ ํ์ด๊ฐ ๊ฝค๋ ์งง์ ํ์ด๊ฐ ์์ด ๋ถ์ํ๊ณ ์ ํ๋ค.
๋์ ํฉ ๋ฆฌ์คํธ๋ ๋ฐ๋ก ๋ง๋ค์ง ์๊ณ ๋งค๋ฒ ์์ ๋ฆฌ์คํธ์ ๊ฐ์ ๋ํ๊ณ ๋นผ๋ฉฐ ๋น๊ตํ๊ณ ์ ํ๋ num๊ณผ ๋น๊ต ๊ฒฐ๊ณผ๋ฅผ answer์ ์ถ๊ฐํ๋ค. ์ธ์์ ์ธ ๋ถ๋ถ์ ๋งค ๋ฐ๋ณต๋ง๋ค lst[i]๋ฅผ acc์ ๋ํด์ฃผ๋ฉฐ ์ผ์ชฝ ์ธ๋ฑ์ค๋ฅผ acc๊ฐ num๋ณด๋ค ํฐ ๋์ ๊ณ์ ์ด๋์์ผ ์ฃผ๋ ๋ฐฉ์์ ํ์ฉํ์๋ค.
๊ทธ๋ฆฌ๊ณ prime list๋ฅผ returnํด์ฃผ๋ ํจ์๋ฅผ list comprehension์ ์ด์ฉํด ๊น๋ํ๊ฒ ์์ฑํ์ จ๋ค. ์ข์ ๋ก์ง์ด๋ผ๊ณ ์๊ฐํ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ