λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸƒ algorithm/boj

BOJ 2331 - λ°˜λ³΅μˆ˜μ—΄

by HandHand 2021. 6. 7.

문제

λ°±μ€€ 온라인 저지 - 2331번

풀이 κ³Όμ •

κ·œμΉ™μ— 따라 μƒμ„±λ˜λŠ” μˆ«μžλ“€μ„ λͺ¨λ‘ νƒμƒ‰ν•˜λ©° μ΅œμ’…μ μœΌλ‘œ λ°˜λ³΅λ˜λŠ” μˆ˜μ—΄μ„ μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μˆ«μžλ“€μ˜ 개수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

이λ₯Ό μœ„ν•΄ DFS 탐색을 μˆ˜ν–‰ν•˜λ©° 각 μˆ«μžλ“€μ„ 처음 λ°©λ¬Έ, λ‘λ²ˆμ§Έ λ°©λ¬Έ, μ„Έλ²ˆμ§Έ λ°©λ¬Έ μ΄λ ‡κ²Œ μ„Έ μ’…λ₯˜λ‘œ κ΅¬λΆ„ν•΄μ€λ‹ˆλ‹€.

첫번째 방문의 κ²½μš°λŠ” λ¬Έμ œκ°€ μ—†μ§€λ§Œ λ‘λ²ˆμ§Έ λ°©λ¬Έν–ˆμ„λ•ŒλŠ” ν•΄λ‹Ή μˆ«μžκ°€ μ€‘λ³΅λ˜μ–΄ λ‚˜νƒ€λ‚œλ‹€λŠ” μ˜λ―Έμ΄λ―€λ‘œ 방문횟수λ₯Ό μ¦κΈ°μ‹œν‚¨ ν›„ λ‹€μŒ 탐색을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

μ΄λ•Œ κ°€μž₯ 처음 μ„Έλ²ˆμ§Έ λ°©λ¬Έλ˜λŠ” μˆ«μžκ°€ λ‚˜νƒ€λ‚˜λŠ” 경우 μ΄ν›„μ˜ μˆ«μžλ“€μ€ λ˜λ‹€μ‹œ 겹치게 λ˜λ―€λ‘œ 탐색을 계속 μˆ˜ν–‰ν•  ν•„μš”μ—†μ΄ λ°”λ‘œ μ’…λ£Œν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.

μ½”λ“œ


import sys

sys.setrecursionlimit(10**6)

A, P = list(map(int, sys.stdin.readline().split()))


def dfs(here, log):
    if log[here] >= 2:
        return

    log[here] += 1

    new_value = 0
    for d in str(here):
        new_value += int(d) ** P

    if new_value not in log:
        log[new_value] = 0
    dfs(new_value, log)


def solution():
    log = {A: 0}
    dfs(A, log)

    # 1번만 발견된거 카운트
    ans = 0
    for val in log.values():
        if val == 1:
            ans += 1
    return ans


print(solution())
λ°˜μ‘ν˜•

'πŸƒ algorithm > boj' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

BOJ 1781 - 컡라면  (0) 2021.06.07
BOJ 6118 - μˆ¨λ°”κΌ­μ§ˆ  (0) 2021.06.07
BOJ 4889 - μ•ˆμ •μ μΈ λ¬Έμžμ—΄  (0) 2021.06.07
BOJ 4811 - μ•Œμ•½  (0) 2021.06.07
BOJ 5980 - Corn Maze  (0) 2021.06.07

πŸ’¬ λŒ“κΈ€