suvera-dev πŸ₯¦

Algorithm) Dynamic Programming 문제 본문

Algorithm/CodingTest - Python

Algorithm) Dynamic Programming 문제

suvera 2022. 5. 3. 15:30

1. 1둜 λ§Œλ“€κΈ°

μ •μˆ˜ Xκ°€ μ£Όμ–΄μ§ˆ λ•Œ μ •μˆ˜X에 μ‚¬μš©ν•  수 μžˆλŠ” 연산은 λ‹€μŒκ³Ό 같이 4가지 이닀.

1) Xκ°€ 5둜 λ‚˜λˆ„μ–΄λ–¨μ–΄μ§€λ©΄, 5둜 λ‚˜λˆˆλ‹€.

2) Xκ°€ 3으둜 λ‚˜λˆ„μ–΄λ–¨μ–΄μ§€λ©΄, 3으둜 λ‚˜λˆˆλ‹€.

3) Xκ°€ 2둜 λ‚˜λˆ„μ–΄ 떨어지면, 2둜 λ‚˜λˆˆλ‹€.

4) Xμ—μ„œ 1을 λΊ€λ‹€.

 

μ •μˆ˜ Xκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, μ—°μ‚° 4개λ₯Ό 적절히 μ‚¬μš©ν•΄μ„œ 1을 λ§Œλ“€λ €κ³  ν•œλ‹€. 

연산을 μ‚¬μš©ν•˜λŠ” 횟수의 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•˜μ„Έμš”

 

λ¬Έμ œν’€μ΄ λ‹΅μ•ˆ 

x = int(input())

# DP ν…Œμ΄λΈ” μ΄ˆκΈ°ν™” 
d = [0] * 30001

# λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° 진행 - 보텀업
for i in range(2, x+1):
    # ν˜„μž¬μ˜ μˆ˜μ—μ„œ 1을 λΉΌλŠ” 경우
    d[i] = d[i-1] + 1
    # ν˜„μž¬μ˜ μˆ˜κ°€ 2둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” 경우
    if i % 2 == 0:
        d[i] = min(d[i], d[i // 2] + 1)
    # ν˜„μž¬μ˜ μˆ˜κ°€ 3으둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” 경우
    if i % 3 == 0:
        d[i] = min(d[i], d[i // 3] + 1)
    # ν˜„μž¬μ˜ μˆ˜κ°€ 5둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” 경우
    if i % 5 == 0:
        d[i] = min(d[i], d[i // 5] + 1)

print(d[x])

 

 

2. 개미 전사

 

κ°œλ―Έμ „μ‚¬λŠ” λΆ€μ‘±ν•œ μ‹λŸ‰μ„ μΆ©λ‹Ήν•˜κ³ μž λ©”λšœκΈ° λ§ˆμ„μ˜ μ‹λŸ‰μ°½κ³ λ₯Ό λͺ°λž˜ κ³΅κ²©ν•˜λ €κ³  ν•œλ‹€.

λ©”λšœκΈ° λ§ˆμ„μ—λŠ” μ—¬λŸ¬ 개의 μ‹λŸ‰μ°½κ³ κ°€ μžˆλŠ”λ° μ‹λŸ‰μ°½κ³ λŠ” μΌμ§μ„ μœΌλ‘œ 이어져 μžˆλ‹€.

각 μ‹λŸ‰ μ°½κ³ μ—λŠ” 정해진 수의 μ‹λŸ‰μ„ μ €μž₯ν•˜κ³  있으며 개미 μ „μ‚¬λŠ” μ‹λŸ‰μ°½κ³ λ₯Ό μ„ νƒμ μœΌλ‘œ μ•½νƒˆν•˜μ—¬ 

μ‹λŸ‰μ„ 빼앗을 μ˜ˆμ •. λ©”λšœκΈ° 정찰병듀을 일직선상에 μ‘΄μž¬ν•˜λŠ” μ‹λŸ‰μ°½κ³  μ€‘μ—μ„œ μ„œλ‘œ μΈμ ‘ν•œ

μ‹λŸ‰μ°½κ³ κ°€ κ³΅κ²©λ°›μœΌλ©΄ λ°”λ‘œ μ•Œμ•„μ±Œμˆ˜ μžˆλ‹€. 개미 전사가 μ •μ°°λ³‘μ—κ²Œ 듀킀지 μ•Šκ³  μ‹λŸ‰μ°½κ³ λ₯Ό μ•½νƒˆν•˜κΈ° 

μœ„ν•΄μ„œλŠ” μ΅œμ†Œν•œ ν•œ μΉΈ 이상 떨어진 μ‹λŸ‰μ°½κ³ λ₯Ό μ•½νƒˆν•΄μ•Όλœλ‹€. 

 

1 / 3 / 1 / 5

λ‹€μŒκ³Ό 같은 μ‹λŸ‰μ°½κ³  4κ°œκ°€ μžˆλ‹€κ³  ν•˜λ©΄, κ°œλ―Έμ „μ‚¬λŠ” λ‘λ²ˆμ§Έ μ‹λŸ‰ 창고와 λ„€λ²ˆμ§Έ μ°½μ†Œλ₯Ό μ„ νƒν–ˆμ„ λ•Œ 

μ΅œλŒ“κ°’μΈ 총 8 개의 μ‹λŸ‰μ„ 빼앗을 수 μžˆλ‹€. μ‹λŸ‰μ°½κ³  Nκ°œμ— λŒ€ν•œ 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ 

얻을 수 μžˆλŠ” μ‹λŸ‰μ˜ μ΅œλŒ“κ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€ !

 

λ¬Έμ œν•΄κ²° 아이디어

νŠΉμ •ν•œ i번째 μ‹λŸ‰μ°½κ³ μ— λŒ€ν•΄μ„œ 털지 μ•ˆν„Έμ§€ 의 μ—¬λΆ€λ₯Ό κ²°μ •ν• λ•Œ, 2κ°€μ§€λ§Œ 확인

i-1 번째λ₯Ό ν„Έλ©΄ i λ²ˆμ§ΈλŠ” μ•ˆλ¨

i-2 번째λ₯Ό ν„Έλ©΄ i 번째 κ°€λŠ₯ 

두 가지 κ²½μš°μ€‘ 더 λ§Žμ€ μ‹λŸ‰μ„ ν„Έμˆ˜μžˆλŠ” 방법을 선택 

 

i번째 μ‹λŸ‰μ°½κ³ μ— λŒ€ν•œ 졜적의 ν•΄λ₯Ό ꡬ할 λ•Œ  μ™Όμͺ½λΆ€ν„° i-3번째 μ΄ν•˜μ˜ μ‹λŸ‰μ°½κ³ μ— λŒ€ν•œ

졜적의 해에 λŒ€ν•΄μ„œλŠ” κ³ λ €ν•  ν•„μš”κ°€ μ—†λ‹€.

d[i-3]은 d [i-1]κ³Ό d[i-2]λ₯Ό κ΅¬ν•˜λŠ” κ³Όμ •μ—μ„œ 이미 κ³„μ‚°λ˜μ—ˆκΈ° λ•Œλ¬Έ

n = int(input())
# μ‹λŸ‰ 정보 μž…λ ₯λ°›κΈ° 
array = list(map(int, input().split()))

# μ•žμ„œ κ³„μ‚°λœ κ²°κ³Όλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ dp ν…Œμ΄λΈ” μ΄ˆκΈ°ν™” !
d = [0] * 100
# λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° 보텀업방식
d[0] = array[0]
d[1] = max(array[0], array[1])

for i in range(2, n):
    d[i] = max(d[i-1], d[i-2] + array[i])

print(d[n-1])

 

 

 

 

 

 

'Algorithm > CodingTest - Python' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Algorithm) Dynamic programming  (0) 2022.04.09
Algorithm ) Binary Search 문제  (0) 2022.04.07
Algorithm) Binary Search  (0) 2022.04.07
Algorithm) Sorting 기본문제  (0) 2022.04.07
Algorithm) Sorting  (0) 2022.04.03
Comments