λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm/λ°±μ€€(BOJ)

[ 파이썬(python) ] λ°±μ€€ 2331 - λ°˜λ³΅μˆ˜μ—΄

by YWTechIT 2021. 4. 17.
728x90

πŸ“Œ λ°±μ€€ 2331 - λ°˜λ³΅μˆ˜μ—΄

문제 μ„€λͺ…


πŸ’‘ λ‚˜μ˜ 풀이

μ§€κΈˆκΉŒμ§€ 2차원 κ·Έλž˜ν”„λ‚˜ 리슀트λ₯Ό μ΄μš©ν•œ 문제만 ν’€μ—ˆμ—ˆλŠ”λ°, 1μ°¨μ›μ˜ 수 λ°˜λ³΅μ„ μ΄μš©ν•˜λŠ” 계산은 μƒˆλ‘œμš΄ 접근이 ν•„μš”ν–ˆλ‹€.

 

κ·Έλž˜μ„œ μ–΄λ–€ 탐색을 μ‚¬μš©ν• κΉŒ κ³ λ―Όν•˜λ‹€ BFSλ₯Ό μ‚¬μš©ν–ˆλŠ”λ°, 감이 잘 μž‘νžˆμ§€ μ•Šμ•˜λ‹€. μ°Ύμ•„λ³΄λ‹ˆκΉŒ DFSλ₯Ό μ΄μš©ν•˜κ³ , μ–΄λ–€ μ½”λ“œλŠ” μ•„μ˜ˆ DFSλ₯Ό μ‚¬μš©ν•˜μ§€λ„ μ•Šμ•˜λ‹€.

728x90

또, 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))
λ°˜μ‘ν˜•

λŒ“κΈ€