๋ฌธ์ ์ค๋ช
์ฝ๋ผ์ธ ์ถ์ธก์ด๋ ๋กํ๋ฅด ์ฝ๋ผ์ธ (Lothar Collatz)๊ฐ 1937๋ ์ ์ ๊ธฐํ ์ถ์ธก์ผ๋ก ๋ชจ๋ ์์ฐ์ n์ ๋ํด ๋ค์ ์์ ์ ๋ฐ๋ณตํ๋ฉด ํญ์ 1๋ก ๋ง๋ค ์ ์๋ค๋ ์ถ์ธก์ ๋๋ค.
1-1. ์
๋ ฅ๋ ์๊ฐ ์ง์๋ผ๋ฉด 2๋ก ๋๋๋๋ค.
1-2. ์
๋ ฅ๋ ์๊ฐ ํ์๋ผ๋ฉด 3์ ๊ณฑํ๊ณ 1์ ๋ํฉ๋๋ค.
2.๊ฒฐ๊ณผ๋ก ๋์จ ์๊ฐ 1๋ณด๋ค ํฌ๋ค๋ฉด 1๋ฒ ์์
์ ๋ฐ๋ณตํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ฃผ์ด์ง ์๊ฐ 5 ๋ผ๋ฉด 5 ⇒ 16 ⇒ 8 ⇒ 4 ⇒2 ⇒ 1 ์ด๋์ด ์ด 5๋ฒ๋ง์ 1์ด ๋ฉ๋๋ค.
์๊ฐ ์ปค์ก๋ค ์์์ง๊ธฐ๋ฅผ ๋ฐ๋ณตํ๋ ๋ชจ์ต์ด ๋น๊ตฌ๋ฆ์์ ๋น๋ฐฉ์ธ์ด ์ค๋ฅด๋ฝ๋ด๋ฆฌ๋ฝํ๋ฉฐ ์ฐ๋ฐ์ด ๋๋ ๋ชจ์ต๊ณผ ๋น์ทํ๋ค๊ณ ํ์ฌ ์ฐ๋ฐ์ ๋๋ ์ฐ๋ฐ์์ด๋ก ๋ถ๋ฆฌ๊ธฐ๋ ํฉ๋๋ค. ํ์ฌ ์ด ์ถ์ธก์ด ์ฐธ์ธ์ง ๊ฑฐ์ง์ธ์ง ์ฆ๋ช ๋์ง ์์์ง๋ง ์ฝ 1ํด๊น์ง์ ์์์ ๋ฐ๋ก๊ฐ ์์์ด ๋ฐํ์ ธ ์์ต๋๋ค.
์์ง๋ ์ฐ๋ฐ์์ด์ ์ขํ ํ๋ฉด ์์ ๊บพ์์ ๊ทธ๋ํ๋ก ๋ํ๋ด๋ณด๋ ค๊ณ ํฉ๋๋ค. ์ดํญ์ด K์ธ ์ฐ๋ฐ์์ด์ด ์๋ค๋ฉด, x = 0์ผ๋ y = K์ด๊ณ ๋ค์ ์ฐ๋ฐ์๋ x = 1์ ํ์ํฉ๋๋ค. ์ด๋ฐ ์์ผ๋ก ์ฐ๋ฐ์๊ฐ 1์ด ๋ ๋๊น์ง ์ ๋ค์ ์ฐ๊ณ ์ธ์ ํ ์ ๋ค๋ผ๋ฆฌ ์ง์ ์ผ๋ก ์ฐ๊ฒฐํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊บพ์์ ๊ทธ๋ํ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์์ง๋ ์ด๋ ๊ฒ ๋ง๋ ๊บพ์์ ๊ทธ๋ํ๋ฅผ ์ ์ ๋ถ ํด๋ณด๊ณ ์ถ์ด์ก์ต๋๋ค. x์ ๋ํ ์ด๋ค ๋ฒ์ [a, b]๊ฐ ์ฃผ์ด์ง๋ค๋ฉด ์ด ๋ฒ์์ ๋ํ ์ ์ ๋ถ ๊ฒฐ๊ณผ๋ ๊บพ์์ ๊ทธ๋ํ์ x = a, x = b, y = 0 ์ผ๋ก ๋๋ฌ ์์ธ ๊ณต๊ฐ์ ๋ฉด์ ๊ณผ ๊ฐ์ต๋๋ค. ์์ง๋ ์ด๊ฒ์ ์ฐ๋ฐ์์ด ์ ์ ๋ถ์ด๋ผ๊ณ ์ ์ํ์๊ณ ๋ค์ํ ๊ตฌ๊ฐ์ ๋ํด์ ์ฐ๋ฐ์์ด ์ ์ ๋ถ์ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
๋จ, ์ฐ๋ฐ์์ด ๊ทธ๋ํ์ ๊ฐ๋ก์ถ ๊ธธ์ด๋ฅผ ๋ฏธ๋ฆฌ ์ ์ ์๊ธฐ ๋๋ฌธ์ ๊ตฌ๊ฐ์ ์์์ ์์ด ์๋ ์ ์, ๊ตฌ๊ฐ์ ๋์ ์์ด ์๋ ์ ์๋ก ํํํฉ๋๋ค. ์ด๋ ๊ฐ๊ฐ ๊บพ์์ ๊ทธ๋ํ๊ฐ ์์ํ๋ ์ ๊ณผ ๋๋๋ ์ ์ x์ขํ์ ๋ํ ์๋์ ์ธ ์คํ์ ์ ์๋ฏธํฉ๋๋ค.
์๋ฅผ ๋ค์ด, 5๋ฅผ ์ดํญ์ผ๋ก ํ๋ ์ฐ๋ฐ์์ด์ 5 ⇒ 16 ⇒ 8 ⇒ 4 ⇒ 2 ⇒ 1 ์ ๋๋ค. ์ด๋ฅผ ์ขํ ํ๋ฉด์ผ๋ก ์ฎ๊ธฐ๋ฉด (0, 5), (1, 16), (2, 8), (3, 4), (4, 2), (5, 1) ์ ์ ์ด ์ฐํ๊ณ ์ ๋ค์ ์ฐ๊ฒฐํ๋ฉด ๊บพ์์ ๊ทธ๋ํ๊ฐ ๋์ต๋๋ค. ์ด๋ฅผ [0,0] ๊ตฌ๊ฐ์ ๋ํด ์ ์ ๋ถ ํ๋ค๋ฉด ์ ์ฒด ๊ตฌ๊ฐ์ ๋ํ ์ ์ ๋ถ์ด๋ฉฐ, [1,-2] ๊ตฌ๊ฐ์ ๋ํด ์ ์ ๋ถ ํ๋ค๋ฉด 1 ≤ x ≤ 3์ธ ๊ตฌ๊ฐ์ ๋ํ ์ ์ ๋ถ์ ๋๋ค.
์ฐ๋ฐ์์ ์ดํญ k์, ์ ์ ๋ถ์ ๊ตฌํ๋ ๊ตฌ๊ฐ๋ค์ ๋ชฉ๋ก ranges๊ฐ ์ฃผ์ด์ก์ ๋ ์ ์ ๋ถ์ ๊ฒฐ๊ณผ ๋ชฉ๋ก์ return ํ๋๋ก solution์ ์์ฑํด์ฃผ์ธ์. ๋จ, ์ฃผ์ด์ง ๊ตฌ๊ฐ์ ์์์ ์ด ๋์ ๋ณด๋ค ์ปค์ ์ ํจํ์ง ์์ ๊ตฌ๊ฐ์ด ์ฃผ์ด์ง ์ ์์ผ๋ฉฐ ์ด๋์ ์ ์ ๋ถ ๊ฒฐ๊ณผ๋ -1๋ก ์ ์ํฉ๋๋ค.
์ ํ ์ฌํญ
- 2 ≤ k ≤ 10,000
- 1 ≤ ranges์ ๊ธธ์ด ≤ 10,000
- ranges์ ์์๋ [a, b] ํ์์ด๋ฉฐ 0 ≤ a < 200, -200 < b ≤ 0 ์ ๋๋ค.
- ์ฃผ์ด์ง ๋ชจ๋ ์ ๋ ฅ์ ๋ํด ์ ์ ๋ถ์ ๊ฒฐ๊ณผ๋ 227 ์ ๋์ง ์์ต๋๋ค.
- ๋ณธ ๋ฌธ์ ๋ ์ ๋ต์ ์ค์ํ์ด ํฌํจ๋๋ ๋ฌธ์ ์ ๋๋ค. ์ ์ถ๋ ฅ ์์ ์์ ๋ถ๋ถ .0์ด ์ฝ๋ ์คํ ๋ฒํผ ํด๋ฆญ ํ ๋ํ๋๋ ๊ฒฐ๊ด๊ฐ, ๊ธฐ๋๊ฐ ํ์์ ๋ค๋ฅผ ์ ์์ต๋๋ค.
์ ์ถ๋ ฅ ์
k | ranges | result |
5 | [[0,0],[0,-1],[2,-3],[3,-3]] | [33.0,31.5,0.0,-1.0] |
์ ์ถ๋ ฅ ์ ์ค๋ช
์ ์ถ๋ ฅ ์ #1
5๋ก ์์ํ๋ ์ฐ๋ฐ์์ด์ 5 ⇒ 16 ⇒ 8 ⇒ 4 ⇒ 2 ⇒ 1 ์ ๋๋ค. ๊ทธ๋ํ์์ ๊บพ์ด๋ ์ง์ ์ ๊ฒฝ๊ณ๋ก 5๊ฐ์ ๊ตฌ์ญ์ผ๋ก ๋๋ ๋ณด๋ฉด ๊ฐ๊ฐ์ ๊ตฌ๊ฐ ๋์ด๋ 10.5, 12, 6, 3, 1.5 ์ ๋๋ค.
๋ฌด์ง์ฑ ํ์ด
- ์ด๋ผ? ํ๋ฒ์ ํต๊ณผ๋ ๊ฑด ์ฒ์์ธ๋ฐ?
def solution(k, ranges):
answer = []
k_list = [k]
while k != 1:
if k % 2 == 0:
k = k // 2
else:
k = k * 3 + 1
k_list.append(k)
k_range = len(k_list)
def hailstorm_memoization(n,memo={}):
if n in memo:
return memo[n]
else:
memo[n] = min(k_list[n],k_list[n+1]) + abs(k_list[n] - k_list[n+1])/2
return memo[n]
for i in range(len(ranges)):
a = ranges[i][0]
b = ranges[i][1] + k_range - 1
_tmp = 0
if a < b:
for i in range(a, b):
_tmp += hailstorm_memoization(i)
elif a > b:
_tmp = -1
answer.append(_tmp)
return answer
์ ํ์ฑ ํ
์คํธ
ํ
์คํธ 1 ใ ํต๊ณผ (0.01ms, 10.2MB)
ํ
์คํธ 2 ใ ํต๊ณผ (1.29ms, 10.3MB)
ํ
์คํธ 3 ใ ํต๊ณผ (38.30ms, 12.3MB)
ํ
์คํธ 4 ใ ํต๊ณผ (2.50ms, 10.6MB)
ํ
์คํธ 5 ใ ํต๊ณผ (0.98ms, 10.3MB)
ํ
์คํธ 6 ใ ํต๊ณผ (7.37ms, 10.8MB)
ํ
์คํธ 7 ใ ํต๊ณผ (40.97ms, 12.2MB)
ํ
์คํธ 8 ใ ํต๊ณผ (45.02ms, 12.4MB)
ํ
์คํธ 9 ใ ํต๊ณผ (0.28ms, 10.2MB)
ํ
์คํธ 10 ใ ํต๊ณผ (11.47ms, 10.8MB)
- ๊ทผ๋ฐ ๋ค๋ฅธ ๊ณ ์๋ค์ ํ์ด๋ฅผ ๋ณด๋...
- ํ? ๋ฉ๋ชจ ์ํด๋ ๋๋๋ด?
- ์... ๊ทธ ์์๊น์ง ํฉ์ ๋ค ๋ํด๋๊ณ , ๋นผ๋๊ตฌ๋? ๋๋ฐ!
from itertools import accumulate
def collas(k):
coord = []
while k != 1:
coord.append(k)
if k % 2:
k = k * 3 + 1
else:
k //= 2
coord.append(k)
return coord
def solution(k, ranges):
coord = collas(k)
area = []
for i in range(len(coord) - 1):
area.append((coord[i] + coord[i+1])/2)
area = [0] + list(accumulate(area))
n = len(area) - 1
result = []
for i, j in ranges:
k = n + j
if i > k:
result.append(-1)
elif i == k:
result.append(0)
else:
result.append(area[k] - area[i])
return result
์ ํ์ฑ ํ
์คํธ
ํ
์คํธ 1 ใ ํต๊ณผ (0.01ms, 10.4MB)
ํ
์คํธ 2 ใ ํต๊ณผ (0.09ms, 10.3MB)
ํ
์คํธ 3 ใ ํต๊ณผ (1.43ms, 12.4MB)
ํ
์คํธ 4 ใ ํต๊ณผ (0.24ms, 10.3MB)
ํ
์คํธ 5 ใ ํต๊ณผ (0.12ms, 10.4MB)
ํ
์คํธ 6 ใ ํต๊ณผ (0.45ms, 10.6MB)
ํ
์คํธ 7 ใ ํต๊ณผ (1.49ms, 12MB)
ํ
์คํธ 8 ใ ํต๊ณผ (2.64ms, 12.5MB)
ํ
์คํธ 9 ใ ํต๊ณผ (0.09ms, 10.4MB)
ํ
์คํธ 10 ใ ํต๊ณผ (0.97ms, 11MB)
def solution(k, ranges):
answer = []
arr = [k]
while k > 1:
if not k % 2: k //= 2
else: k = k*3+1
arr.append(k)
area = [0]
for i in range(len(arr)-1):
area.append(area[-1]+(arr[i]+arr[i+1])/2)
for a, b in ranges:
if a >= len(area) or b-1 < -len(area): answer.append(-1)
elif area[b-1]-area[a] < 0: answer.append(-1)
else: answer.append(area[b-1]-area[a])
return answer
์ ํ์ฑ ํ
์คํธ
ํ
์คํธ 1 ใ ํต๊ณผ (0.01ms, 10.3MB)
ํ
์คํธ 2 ใ ํต๊ณผ (0.20ms, 10.4MB)
ํ
์คํธ 3 ใ ํต๊ณผ (3.45ms, 12.3MB)
ํ
์คํธ 4 ใ ํต๊ณผ (0.73ms, 10.5MB)
ํ
์คํธ 5 ใ ํต๊ณผ (0.27ms, 10MB)
ํ
์คํธ 6 ใ ํต๊ณผ (1.05ms, 10.8MB)
ํ
์คํธ 7 ใ ํต๊ณผ (5.39ms, 11.9MB)
ํ
์คํธ 8 ใ ํต๊ณผ (5.75ms, 12.3MB)
ํ
์คํธ 9 ใ ํต๊ณผ (0.09ms, 10.1MB)
ํ
์คํธ 10 ใ ํต๊ณผ (1.22ms, 10.9MB)
- ๋ด ์ฝ๋์์ ๋ฉ๋ชจ์ด์ ์ด์ ๋ง ๋นผ๋ฉด?
- for๋ฌธ์ด ํ๋ ์์ด์ ์ ๋นจ๋ผ์ง.
def solution(k, ranges):
answer = []
k_list = [k]
while k != 1:
if k % 2 == 0:
k = k // 2
else:
k = k * 3 + 1
k_list.append(k)
for n in range(len(k_list)-1):
k_list[n] = (k_list[n] + k_list[n+1])/2 # ์ด๊ฑธ ์ ์ด๋ ต๊ฒ ์๊ฐํ์๊น...
lk = len(k_list) - 1
for a, b in ranges:
b += lk
if a < b:
_tmp = 0
for i in range(a, b): # ์ด ๋ถ๋ถ ๋๋ฌธ์ ๋๋ ค์ง.
_tmp += k_list[i]
answer.append(_tmp)
elif a > b:
answer.append(-1)
if a == b:
answer.append(0)
return answer
- ๊ทธ๋๋ ์๊น ๊ฒ ๋ณด๋ค ๋น ๋ฅด๊ธด ํ๋ค.
- ํจ์จ์ฑ ํ ์คํธ๊ฐ ์์ผ๋ฉด ๊ทธ๋ฅ for๋ฌธ ์ ๊ฒ ๋๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์ง๋๊ฒ ์ ์ผ ์ข์ ๊ฒ ๊ฐ๋ค.
์ ํ์ฑ ํ
์คํธ
ํ
์คํธ 1 ใ ํต๊ณผ (0.02ms, 10.2MB)
ํ
์คํธ 2 ใ ํต๊ณผ (0.40ms, 10.3MB)
ํ
์คํธ 3 ใ ํต๊ณผ (15.82ms, 12.1MB)
ํ
์คํธ 4 ใ ํต๊ณผ (1.16ms, 10.4MB)
ํ
์คํธ 5 ใ ํต๊ณผ (0.67ms, 10.2MB)
ํ
์คํธ 6 ใ ํต๊ณผ (3.17ms, 10.6MB)
ํ
์คํธ 7 ใ ํต๊ณผ (18.05ms, 12MB)
ํ
์คํธ 8 ใ ํต๊ณผ (18.10ms, 12.2MB)
ํ
์คํธ 9 ใ ํต๊ณผ (0.14ms, 10.1MB)
ํ
์คํธ 10 ใ ํต๊ณผ (4.23ms, 10.8MB)
์ํฌ์์ ์ ์ ๋ถ ใ .ใ
'๊ฒ์ ํ๋ก๊ทธ๋๋ฐ > Python ํ๋ก๊ทธ๋๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก๊ทธ๋๋จธ์ค ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ ์ฐพ๊ธฐ (0) | 2023.02.16 |
---|---|
ํ๋ก๊ทธ๋๋จธ์ค ๋ ํ ํฉ ๊ฐ๊ฒ ๋ง๋ค๊ธฐ (0) | 2023.02.16 |
ํ๋ก๊ทธ๋๋จธ์ค ์ซ์ ์นด๋ ๋๋๊ธฐ (0) | 2023.02.15 |
ํ๋ก๊ทธ๋๋จธ์ค ํ ์ด๋ธ ํด์ ํจ์ (0) | 2023.02.15 |
ํ๋ก๊ทธ๋๋จธ์ค ๋ํ์ค ๊ฒ์ (0) | 2023.02.15 |