π λ°±μ€ 2331 - λ°λ³΅μμ΄
π‘ λμ νμ΄
μ§κΈκΉμ§ 2μ°¨μ κ·Έλνλ 리μ€νΈλ₯Ό μ΄μ©ν λ¬Έμ λ§ νμμλλ°, 1μ°¨μμ μ λ°λ³΅μ μ΄μ©νλ κ³μ°μ μλ‘μ΄ μ κ·Όμ΄ νμνλ€.
κ·Έλμ μ΄λ€ νμμ μ¬μ©ν κΉ κ³ λ―Όνλ€ BFS
λ₯Ό μ¬μ©νλλ°, κ°μ΄ μ μ‘νμ§ μμλ€. μ°Ύμ보λκΉ DFS
λ₯Ό μ΄μ©νκ³ , μ΄λ€ μ½λλ μμ DFS
λ₯Ό μ¬μ©νμ§λ μμλ€.
λ, DFSλ₯Ό μ΄μ©ν λ Flag λ°©μμ μ¬μ©νλ €κ³ νλλ°, μ€λ΅ νμ μ λ°μλ€. νμ¬ κ°μ νλΌλ―Έν°λ‘ μ ν΄μ£Όμ§ μμ κ·Έλ°κ±΄μ§.. λν΅ μ΄μ λ₯Ό λͺ¨λ₯΄κ² λ€. μ μΌ νλ¨μ failμ½λλ₯Ό λ³΄κ³ μ μλλμ§ μμλ κ³ μλλ€ λκΈ λΆνλ립λλ€. γ γ π π
DFS - λ°λ³΅ μμ΄μ μ§ννλ©° νμ¬ κ°μ κΈ°μ€μΌλ‘ λ€μ μμλ₯Ό νμνκ³ , μ΄μ μ λμλ μμ(μ€λ³΅ μμ)κ° λμ¬ λκΉμ§ λ€μ κ°μ κ³μ νμνλ€. μ΄λ, μ΄μ μμλ₯Ό λ°©λ¬Ένλμ§ νμΈνλ visited
μ μ 체 λ²μλ₯Ό 250000
μΌλ‘ μ νλλ°, μμκ° μ΅λλ‘ λμ¬ μ μλ κ°μ΄ 236196
μ΄κΈ° λλ¬Έμ΄λ€. (Aμ κ°μ΄ 9999κΉμ§μ΄κ³ , Pμ μ΅λ μ κ³±μ΄ 5κΈ° λλ¬Έ 9**5+9**5+9**5+9**5 = 236196
) λ§μ§λ§μ μ€λ³΅λλ μμκ° λμ€λ©΄ return
νμ¬ μ²μ μ€λ³΅μ«μκ° λμ¨ μ§μ κΉμ§ μ¬λΌκ°λ€. νΈμΆ μμλ λ€μμ μ¬μ§μ μ°Έκ³ νμ.
while - μ€λ³΅λλ μμκ° λμ€κΈ° μ κΉμ§ κ³μν΄μ result
μ μΆκ°νλ λ°©λ²μ΄λ€. μ΄λ μ€μν μ μ μΆκ°ν μνμμ μ§ννμ. λ, λ°λ³΅λ¬Έ λ§μ§λ§μ νμ¬ κ°μ D[n]
μΌλ‘ λ³κ²½ν΄μ£Όλκ²λ μμ§λ§μ. μΆλ ₯μ index
λ₯Ό μ¬μ©ν΄μ λͺ λ²μ§Έ μμΉμ μλμ§ νμΈνλ©΄ λλ€. index
λ 0λΆν° μΈκΈ° λλ¬Έμ ν΄μ€ νμκ° μλ€.
# DFS
def number_square(number, square): # square P each number
return sum([int(i) ** square for i in str(number)])
def dfs(A, P, visited, count): # DFS implementation
if visited[A]: # if occur repeated number
return visited[A] - 1
visited[A] = count
temp = number_square(A, P)
count += 1
return dfs(temp, P, visited, count)
A, P = map(int, input().split())
visited = [0] * 250000 # maximum case(236196 is approximately 250000)
count = 1
print(dfs(A, P, visited, count))
# use while
A, P = map(int, input().split())
result = [A]
while True:
temp = sum([int(i) ** P for i in str(A)]) # square P each number
if temp in result: # if occur repeated number
break
result.append(temp)
A = temp
print(result.index(temp))
# incorrect code
def number_square(number, square): # square P each number
return sum([int(i) ** square for i in str(number)])
def dfs(A, P, visited): # DFS implementation
if visited[A]: # occur repeated number
return visited.index(visited[A])
visited[A] = True
temp = number_square(A, P)
return dfs(temp, P, visited)
A, P = map(int, input().split())
visited = [False] * 250000 # maximum case
print(dfs(A, P, visited))
'Algorithm > λ°±μ€(BOJ)' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[ νμ΄μ¬(python) ] λ°±μ€ 11724 - μ°κ²° μμμ κ°μ(BFS) (0) | 2021.04.19 |
---|---|
[ νμ΄μ¬(python) ] λ°±μ€ 2468 - μμ μμ (0) | 2021.04.19 |
[ νμ΄μ¬(python) ] λ°±μ€ 2667 - λ¨μ§λ²νΈλΆμ΄κΈ° (0) | 2021.04.16 |
[ νμ΄μ¬(python) ] λ°±μ€ 1260 - DFSμ BFS (0) | 2021.04.16 |
[ νμ΄μ¬(python) ] λ°±μ€ 13458 - μνκ°λ (0) | 2021.04.14 |
λκΈ