๐ง ๋ฐฑ์ค 2581 (์์์ ์๋ฆฌ ์ด์ฉ)
๐คซ ํด๊ฒฐ์ ์ค๋ง๋ฆฌ
๐ค ์์์ ์๋ฆฌ
์์์ ์๋ฆฌ => ์ฝ์์ ๊ฐ์๊ฐ 2๊ฐ (1๊ณผ ์๊ธฐ์์ )
๐ค Algorithm ๊ณผ์
1. num์ด๋ผ๋ ๋น ๋ฆฌ์คํธ์ ์ ๋ ฅ๋ M ~ N๊น์ง์ ์ซ์๋ฅผ ๋ฃ๋๋ค.
2. ์ฝ์์ ๊ฐ์๋ฅผ ์ธ๋ cnt๋ผ๋ ๋ณ์๋ฅผ ์ ์ธ, 0์ผ๋ก ์ด๊ธฐํํ๋ค.
3. ์์๋ฅผ ๋ด์ ๋ฆฌ์คํธ dec์ ์ ์ธํ๋ค.
4. num๋ฆฌ์คํธ์ ์์๋ฅผ ์ฐจ๋ก๋ก ๋๋ฉด์ i % j == 0 ์ฆ, ์ฝ์์ผ ๋, cnt๊ฐ์ ์ฆ๊ฐ์ํจ๋ค.
5. ์ด๋ ๊ฒ ์ฝ์์ ๊ฐ์๊ฐ ๋ด๊ธด cnt๋ณ์์ ๋ํด ๋ง์ฝ ์ฝ์์ ๊ฐ์๊ฐ 2๊ฐ๋ผ๋ฉด(cnt == 2) ์์์ธ๊ฒ!
๋ฐ๋ผ์ ์์๋ผ๋ฉด dec ๋ฆฌ์คํธ์ ์์๋ฅผ ์ถ๊ฐํด์ฃผ๊ณ cnt==0์ด๋ผ๋ฉด ์์๊ฐ ์๋ ๊ฒ์ด๋ฏ๋ก 0์ ์ถ๋ ฅ!
๐คซ solution_2581M, N = int(input()), int(input()) num = [] for i in range(N-M+1): num.append(i+M) dec = [] for i in num: cnt = 0 for j in range(1, i+1): if i % j == 0: cnt += 1 if cnt == 2: dec.append(i) if len(dec) == 0: print(-1) else: print(sum(dec)) print(min(dec))
๐ง ๋ฐฑ์ค 1929 (์๋ผํ ์คํ ๋ค์ค์ ์ฒด) _ ์์ผ๋ก ๊ณ์ ์ด ๋ฌธ์ ์์ ํ์ํ์ฌ ๋ฌธํญ์ ํด๊ฒฐํจ
๐คซ ํด๊ฒฐ์ ์ค๋ง๋ฆฌ
๐ค ์๋ผํ ์คํ ๋ค์ค์ ์ฒด (Sieve of Eratosthenes)
์๋ผํ ์คํ ๋ค์ค์ ์ฒด ์๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
1. ์์๊ฐ ์๋ 1์ ์ง์ด๋ค.
2. 2์ ๋ฐฐ์๋ฅผ ์ง์ด๋ค.
3. ์์ ์ง์ด 2์ ๋ฐฐ์๊ฐ ์๋ ๊ฒ๋ค ์ค ์ต์๊ฐ์ธ 3์ ๋ฐฐ์๋ฅผ ์ง์ด๋ค.
4. ์์ ์ง์ด 2, 3์ ๋ฐฐ์๊ฐ ์๋ ๊ฐ๋ค ์ค ์ต์๊ฐ์ธ 5์ ๋ฐฐ์๋ฅผ ์ง์ด๋ค.
5. ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ๊ฑธ๋ฌ์ง๋ ๊ฒ๋ค์ด ๋น๋ก์ ์์๊ฐ ๋๋ค.
์ด๋ฌํ ์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ "ํน์ ๊ตฌ๊ฐ์ด ์ฃผ์ด์ก์ ๋" ๋งค์ฐ ๋น ๋ฅด๊ฒ ์์๋ฅผ ๋์ถํ ์ ์๋ค.
์์ 2581๋ฒ์ฒ๋ผ ํ๋ฉด ์๊ฐ๋ณต์ก๋๋ O(n)์ผ๋ก ๋น๊ต์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค.
ํ์ง๋ง ์๋ผํ ์คํ ๋ค์ค์ ์ฒด์ ์๊ฐ๋ณต์ก๋๋ O(nlog(log n))์ผ๋ก ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋์ถ์ด ๊ฐ๋ฅํ๋ค.
๋ํ ์ฝ์์ ๊ฒฝ์ฐ, 2*4, 4*2 ์ฒ๋ผ ๋ฐ๋ณต์ด ๋๊ธฐ ๋๋ฌธ์
๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ฒ์์ ๋ง์ง๋ง ์์ ๋ฃจํธ ๊ฐ๊น์ง๋ง ๋ฐ๋ณตํจ์ผ๋ก ์๊ฐ์ ๋์ฑ ์ค์ผ ์ ์๋ค!
๐ค Algorithm ๊ณผ์
์๊ณ ๋ฆฌ์ฆ๊ณผ์ ์ ์์์ ์ค๋ช ํ๋ ์๋ผํ ์คํ ๋ค์ค์ ๋ฐฉ์์ ์ฐจ์ฉํ์๋ค.
๋ํ ์ฝ๋์ ๋ํ ์ค๋ช ์ ์๋ ๊ทธ๋ฆผ์ผ๋ก ๋์ฒดํ๊ฒ ๋ค.
๐คซ solution_1929
m, n = map(int, input().split()) num = [i for i in range(max(2, m), n+1)] # m ~ n์ฌ์ด ์ซ์๋ฅผ ๋ฃ์ ๋ฆฌ์คํธ (๋จ, 1์ ์ ์ธ) dec_sqr_n = [] # n์ ์ ๊ณฑ๊ทผ๊น์ง์ ๋ฒ์์์์ ์์๋ฅผ ์ง์ด ๋ฃ์ ๋ฆฌ์คํธ for i in range(2, int(n**0.5) + 1): # 2์์ n์ ์ ๊ณฑ๊ทผ๊น์ง๋ง ๋ฐ๋ณต if i in num: dec_sqr_n.append(i) num = [j for j in num if j % i != 0] print(*(dec_sqr_n + num), sep = "\n")
๐ง ๋ฐฑ์ค 4948 (์๋ผํ ์คํ ๋ค์ค์ ์ฒด)
๐คซ ํด๊ฒฐ์ ์ค๋ง๋ฆฌ
๐ค ์๋ผํ ์คํ ๋ค์ค์ ์ฒด (Sieve of Eratosthenes)
๐ค Algorithm ๊ณผ์
์ 1929์ ๊ฑฐ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ํ์์ง๋ง ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. n์ ๋ฒ์ ์ฌ์ด์ ์์ฐ์๋ฅผ ์ ์ฅํ๋ num ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ค. (1 ≤ n ≤ 123456)
2. ๋ฆฌ์คํธ num์ 1929๋ฒ ํ์ด์ฒ๋ผ ์์๋ง ์กด์ฌํ๋๋ก ๋ง๋ค์ด์ค๋ค.
3. 1929์ ๊ฐ์ ๋ฐฉ์์ผ๋ก n์ ๋ฒ์์ฌ์ด์ ์กด์ฌํ๋ ๋ชจ๋ ์์๊ฐ ๋ด๊ธด decimal์ด๋ผ๋ ๋ฆฌ์คํธ๋ฅผ ์์ฑํด์ค๋ค.
4. 0์ด ๋ค์ด์ค๊ธฐ ์ ๊น์ง while๋ฌธ์ ์ด์ฉํด ์ ๋ ฅ์ ๋ฐ์์ฃผ๊ณ
5. decimal ๋ฆฌ์คํธ์์ ์ ๋ ฅ์ ๋ฒ์์ ํด๋นํ๋ ๊ฐ๋ค์ ๊ฐ์๋ฅผ ์ธ์ด ์ถ๋ ฅํด์ค๋ค.
๐คซ solution_4948 (์๊ฐ์ด๊ณผ)
def decimal(N): n = N+1 num = [i for i in range(n, 2*N + 1)] dec_half = [] for i in range(2, int((2*N)**0.5) + 1): if i in num: dec_half.append(i) num = [j for j in num if j % i != 0] return len(dec_half+num) num = -1 while True: num = int(input()) if num == 0: break else: print(decimal(num))
์ฒ์ ์ง ์ฝ๋๋ก 1929์ ๋น์ทํ๊ฒ ํจ์๋ฅผ ์์ฑํ์ฌ ํ์์ผ๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ์๋ค.
์๊ฐ๋ณต์ก๋๋ฅผ ์ผ๋ํ์ง ์๊ณ ๋จธ๋ฆฌ๋ฅผ ์ฅ์์ผ๋ก ๋๊ณ ๋ฌธ์ ์ ์ ๊ทผํ ๊ฒฐ๊ณผ๋ผ ์๊ฐํ ์ ๋ฐ์ ์๋ค.
ํจ์์์ 2์ค for๋ฌธ์ ์ฌ์ฉํ ๊ฒ์ while๋ฌธ์์ ๊ณ์ ๋ฐ์ผ๋ ๊ทธ๋ด ์ ๋ฐ์...
๐คซ solution_4948from math import sqrt # 1 <= n <= 123456 ์ฌ์ด ์์ฐ์๋ฅผ ๋ด์ ๋ฆฌ์คํธ ์์ฑ num = [i for i in range(2, 123456 * 2)] # ๋ฆฌ์คํธ num์ ์ด์ ์ฒ๋ผ ์์๋ง ์๊ฒ ๋ง๋ค์ด์ฃผ๊ธฐ. dec_half = [] for i in range(2, int(sqrt(123456*2)) + 1): if i in num: dec_half.append(i) num = [j for j in num if j%i != 0] decimal = dec_half + num n = -1 while True: n = int(input()) if n == 0: break # decimal ๋ฆฌ์คํธ์์ ์ ๋ ฅ์ ๋ฒ์์ ํด๋นํ๋ ๊ฐ๋ค์ ๊ฐ์๋ฅผ ์ธ์ด ์ถ๋ ฅ print(len([i for i in decimal if n < i <= 2*n]))
๐ง ๋ฐฑ์ค 9020 (์๋ผํ ์คํ ๋ค์ค์ ์ฒด)
๐คซ ํด๊ฒฐ์ ์ค๋ง๋ฆฌ
๐ค ์๋ผํ ์คํ ๋ค์ค์ ์ฒด (Sieve of Eratosthenes)
๐ค Algorithm ๊ณผ์
๋ ์์์ ์ฐจ์ด๊ฐ ๊ฐ์ฅ ์์ ๊ฒ์ ์๋ฏธ๋ฅผ ์๊ฐํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์์๊ฐ์ ์ฐจ์ด๊ฐ ์์์๋ก ์ต๋๊ฐ์ ์ ๋ฐ๊ณผ ๊ฐ๊น์์ง๋ค!
16์ผ ์๋ก ๋ค์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
[3, 13], [5, 11] => 3 5 (8) 11 13
๋ฐ๋ผ์ ํต์ฌ์ ์๊ฐ์ด๊ณผ๊ฐ ๊ฑธ๋ฆฌ์ง ์์ผ๋ ค๋ฉด ์์์ ์ ๋ฐ๋ง ํ์ด์ผ ํ๋ค.
๐คซ solution_9020 (์๊ฐ์ด๊ณผ)
T = int(input()) n = [int(input()) for _ in range(T)] num = [i for i in range(2, 10001)] dec_half = [] for i in range(2, 100 + 1): if i in num: dec_half.append(i) num = [j for j in num if j % i != 0] decimal = dec_half + num for i in n: dec = [] for j in range(len(decimal)): for k in range(j, len(decimal)): if i == decimal[j] + decimal[k]: dec.append([decimal[j], decimal[k]]) print(*dec[-1])
์ฒ์ ์ง ์ฝ๋๋ก ๋ฌธ์ ์ ์ ์์์ ์ ์ฒด๋ฅผ ๊ณ์ ํ์ผ๋ฉด์ ๋น๊ต๋ฅผ ์งํํ๊ธฐ ๋๋ฌธ์ ์์ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค 2๋ฐฐ ์ด์์ ์๊ฐ์ด ๊ฑธ๋ฆด ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
๋จผ์ ์์ ์ฝ๋๋ฅผ ์ง ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ๋จผ์ ๋ฒ์์ ํด๋นํ๋ ๋ชจ๋ ์์๋ฅผ ๋ด๋ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๊ณ
2. ๊ทธ ๋ฆฌ์คํธ ์์์ ๋ ์์๊ฐ์ ๋ง์ ์ด ์ ๋ ฅ๊ฐ๊ณผ ๋์ผํ ๊ฒ์ ์ฐพ์์ dec์ด๋ผ๋ ๋ฆฌ์คํธ์ ๋ฃ๋๋ค.
3. dec์๋ [[3, 5]], [[3, 7], [5, 5]], [[3, 13], [5, 11]] ์ฒ๋ผ ๋ค์ด๊ฐ ๊ฒ์ด๋ฏ๋ก
4. ๊ฐ ๋ฆฌ์คํธ์ ๋ง์ง๋ง ์ธ๋ฑ์ค์ ํด๋นํ๋ ๋ฆฌ์คํธ๊ฐ ์ฐจ์ด๊ฐ ๊ฐ์ฅ ์์ ์์ ๋ฆฌ์คํธ์ธ๊ฒ.
์ด๋ฅผ for๋ฌธ์ ์ด์ฉํด ์ถ๋ ฅํ์๋ค.
๐คซ solution_9020num = [i for i in range(2, 10000 + 1)] dec_half = [] for i in range(2, 100 + 1): if i in num: dec_half.append(i) num = [j for j in num if j%i != 0] decimal = dec_half + num T = int(input()) for i in range(T): n = int(input()) n_half = n // 2 for j in range(n_half, 1, -1): if j in decimal and n - j in decimal: print(j, n - j) break