ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 2342 Dance Dance Revolution with Python
    PS 2022. 5. 20. 20:50
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 2342 Dance Dance Revolution

    πŸ’‘ 쑰건

    1. νŽΈμ˜μƒ 쀑점을 0, μœ„λ₯Ό 1, μ™Όμͺ½μ„ 2, μ•„λž˜λ₯Ό 3, 였λ₯Έμͺ½μ„ 4라고 μ •ν•˜μž.

    1. μ²˜μŒμ— κ²Œμ΄λ¨ΈλŠ” 두 λ°œμ„ 쀑앙에 λͺ¨μœΌκ³  μžˆλ‹€.(κ·Έλ¦Όμ—μ„œ 0의 μœ„μΉ˜)
      그리고 κ²Œμž„μ΄ μ‹œμž‘ν•˜λ©΄, μ§€μ‹œμ— 따라 μ™Όμͺ½ λ˜λŠ” 였λ₯Έμͺ½ λ°œμ„ 움직인닀. ν•˜μ§€λ§Œ 그의 두 발이 λ™μ‹œμ— μ›€μ§μ΄μ§€λŠ” μ•ŠλŠ”λ‹€.
    1. 두 발이 같은 지점에 μžˆλŠ” 것이 ν—ˆλ½λ˜μ§€ μ•ŠλŠ”λ‹€.
      ν•œ 발이 1의 μœ„μΉ˜μ— 있고, λ‹€λ₯Έ ν•œ 발이 3의 μœ„μΉ˜μ— μžˆμ„ λ•Œ, 3을 μ—°μ†μœΌλ‘œ λˆŒλŸ¬μ•Ό ν•œλ‹€λ©΄, 3의 μœ„μΉ˜μ— μžˆλŠ” 발둜 λ°˜λ³΅ν•΄μ•Ό λˆŒλŸ¬μ•Ό ν•œλ‹€.
    1. λ°œμ„ 이동할 λ•Œ νž˜μ„ μ‚¬μš©ν•˜κ²Œ λœλ‹€.
      1. 쀑앙에 있던 발이 λ‹€λ₯Έ μ§€μ μœΌλ‘œ 움직일 λ•Œ, 2의 νž˜μ„ μ‚¬μš©ν•˜κ²Œ λœλ‹€.
      2. λ‹€λ₯Έ μ§€μ μ—μ„œ μΈμ ‘ν•œ μ§€μ μœΌλ‘œ 움직일 λ•ŒλŠ” 3의 νž˜μ„ μ‚¬μš©ν•˜κ²Œ λœλ‹€.
      3. λ°˜λŒ€νŽΈμœΌλ‘œ μ›€μ§μΌλ•ŒλŠ” 4의 νž˜μ„ μ‚¬μš©ν•˜κ²Œ λœλ‹€.
      4. 같은 지점을 ν•œλ²ˆ 더 λˆ„λ₯Έλ‹€λ©΄, κ·Έλ•ŒλŠ” 1의 νž˜μ„ μ‚¬μš©ν•˜κ²Œ λœλ‹€.
    1. μž…λ ₯은 μ§€μ‹œ μ‚¬ν•­μœΌλ‘œ 이루어진닀. 각각의 μ§€μ‹œ 사항은 ν•˜λ‚˜μ˜ μˆ˜μ—΄λ‘œ 이루어진닀.
      각각의 μˆ˜μ—΄μ€ 1, 2, 3, 4의 μˆ«μžλ“€λ‘œ 이루어지고, 이 μˆ«μžλ“€μ€ 각각의 λ°©ν–₯을 λ‚˜νƒ€λ‚Έλ‹€.
      μž…λ ₯ 파일의 λ§ˆμ§€λ§‰μ—λŠ” 0이 μž…λ ₯λœλ‹€. μž…λ ₯λ˜λŠ” μˆ˜μ—΄μ˜ κΈΈμ΄λŠ” 100,000을 λ„˜μ§€ μ•ŠλŠ”λ‹€.
    1. λ‹€μ΄λ‚˜λ―Ήν”„λ‘œκ·Έλž˜λ° μœ ν˜•μ˜ 문제

    πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

    import sys
    
    sys.setrecursionlimit(10 ** 6)
    
    
    def move(a, b):
        if a == b:
            return 1
        elif a == 0:
            return 2
        elif abs(b - a) % 2 == 0:
            return 4
        else:
            return 3
    
    
    def solve(n, l, r):
        global dp
        if n >= len(arr) - 1:
            return 0
    
        if dp[n][l][r] != -1:
            return dp[n][l][r]
    
        dp[n][l][r] = min(solve(n + 1, arr[n], r) + move(l, arr[n]), solve(n + 1, l, arr[n]) + move(r, arr[n]))
        return dp[n][l][r]
    
    
    arr = list(map(int, sys.stdin.readline().split()))
    dp = [[[-1] * 5 for _ in range(5)] for _ in range(100000)]
    
    print(solve(0, 0, 0))

    πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

    예제

    1 2 2 4 0

    μ‹€ν–‰κ²°κ³Ό

    8

    ⌨️ 문제 풀이

    1. 문제λ₯Ό κ°„λ‹¨ν•˜κ²Œ λ§ν•˜μžλ©΄, μ΅œμ†Œν•œμ˜ νž˜μ„ μ‚¬μš©ν•΄ μž…λ ₯받은 μˆ˜μ—΄μ˜ 번호λ₯Ό λ‹€ λˆŒλŸ¬μ•Όν•œλ‹€.
    1. λ‹€μ‹œ 말해, μ™Όμͺ½ 발과 였λ₯Έμͺ½ 발이 μ–΄λŠ μœ„μΉ˜μ— μžˆμ„ λ•Œ, μ–΄λ–€ λ°œνŒλΆ€ν„° λ°Ÿμ•„μ•Ό μ΅œμ†Œμ˜ νž˜μ„ 듀일 수 μžˆλŠ”κ°€? 이닀.
    1. κ·Έλ ‡λ‹€λ©΄ 이 λ¬Έμ œλŠ” solve(n, l, r) 이라고 κ°„λ‹¨ν•˜κ²Œ ν•¨μˆ˜μ²˜λŸΌ λ§Œλ“€μ–΄ λ³Ό μˆ˜κ°€ μžˆλ‹€.
      발의 μœ„μΉ˜κ°€ (l,r) 일 λ•Œ n번째 νŒ”νŒλΆ€ν„° λ°Ÿμ•˜μ„ λ•Œ μ†Œλͺ¨λ˜λŠ” 힘이라고 μ •μ˜ν•  수 μžˆλ‹€.
    1. λ°œμ€ λ™μ‹œμ— 움직일 수 μ—†μœΌλ‹ˆ, 발이 μ›€μ§μ΄λŠ” 건 2가지가 μžˆλ‹€.
      solve(n, l, r) 은 μ™Όμͺ½ λ°œμ„ 움직여 λ°œνŒμ„ λ°Ÿμ€ μƒνƒœμ™€ 였λ₯Έμͺ½ λ°œμ„ 움직여 λ°œνŒμ„ λ°Ÿμ€ μƒνƒœμ˜ μ΅œμ†Ÿκ°’μ΄ 될 수 μžˆλ‹€.
    2. κ·Έλ ‡λ‹€λ©΄ μ•„λž˜μ™€ 같이 μ •μ˜ν•  수 μžˆλ‹€.
    min(solve(n + 1, arr[n], r) + move(l, arr[n]), solve(n + 1, l, arr[n]) + move(r, arr[n]))

    πŸ’Ύ 배운점

    1. λ©”λͺ¨μ΄μ œμ΄μ…˜κ³Ό μž¬κ·€ν•¨μˆ˜λ₯Ό 톡해 결과값을 λ„μΆœν•˜λŠ” 방법
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.