Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

12-pu2rile #40

Merged
merged 2 commits into from
Sep 4, 2024
Merged

12-pu2rile #40

merged 2 commits into from
Sep 4, 2024

Conversation

pu2rile
Copy link
Collaborator

@pu2rile pu2rile commented Jul 23, 2024

πŸ”— 문제 링크

λ°±μ€€ - 1ν•™λ…„

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

1μ‹œκ°„...?

✨ μˆ˜λ„ μ½”λ“œ

문제 μš”μ•½

주어진 숫자 리슀트의 각 μˆ«μžλ“€ 사이에 λ”ν•˜κΈ°(+) λ˜λŠ” λΉΌκΈ°(-) 연산을 ν•΄μ„œ μ—°μ‚°μ˜ κ²°κ³Όκ°€ 리슀트의 λ§ˆμ§€λ§‰ μˆ«μžκ°€ λ˜λ„λ‘ ν•˜λŠ” 경우의 수λ₯Ό κ΅¬ν•˜λŠ” 것

풀이 방식

  • DP ν…Œμ΄λΈ”μ„ μ΄μš©ν•΄ 각 숫자 μœ„μΉ˜μ—μ„œ κ°€λŠ₯ν•œ 값듀을 μ €μž₯
  • 각 μœ„μΉ˜μ—μ„œ κ°€λŠ₯ν•œ 값을 이전 μœ„μΉ˜μ—μ„œ λ”ν•˜κ±°λ‚˜ λΉΌλŠ” λ°©μ‹μœΌλ‘œ κ°±μ‹ 

DP μ‚¬μš© μ΄μœ β“

  1. λΆ€λΆ„ 문제의 쀑볡 을 ν”Όν•˜κΈ° μœ„ν•΄ 이전에 κ³„μ‚°ν•œ κ²°κ³Όλ₯Ό μ €μž₯ν•˜κ³  μž¬μ‚¬μš©
  2. κ°€λŠ₯ν•œ 숫자의 λ²”μœ„κ°€ 0λΆ€ν„° 20κΉŒμ§€λ‘œ μ œν•œλ˜μ–΄ 있기 λ•Œλ¬Έμ—, DP ν…Œμ΄λΈ” 을 μ‚¬μš©ν•˜μ—¬ 각 λ‹¨κ³„μ—μ„œ κ°€λŠ₯ν•œ 값듀을 효율적으둜 계산
    2-1. 이 λ¬Έμ œμ—μ„œ DP ν…Œμ΄λΈ”
    • dp[i][j]λŠ” i번째 μˆ«μžκΉŒμ§€ μ΄μš©ν•΄μ„œ jκ°’ 을 λ§Œλ“€ 수 μžˆλŠ” 경우의 수λ₯Ό 의미

ν•΄κ²° κ³Όμ •

숫자 λ¦¬μŠ€νŠΈκ°€ [8, 3, 2, 4, 8, 7, 2, 4, 0, 8]이고, λͺ©ν‘œ μˆ«μžκ°€ 8

  1. 초기 μƒνƒœμ—μ„œ 첫 번째 숫자 8을 μ„€μ •
  2. λ‹€μŒ λ‹¨κ³„μ—μ„œ 숫자 3을 λ”ν•˜κ±°λ‚˜ λΉΌλŠ” λ°©μ‹μœΌλ‘œ κ°€λŠ₯ν•œ λͺ¨λ“  숫자 μƒνƒœλ₯Ό κ°±μ‹ 
  3. μœ„ 과정을 λ°˜λ³΅ν•˜μ—¬ λ§ˆμ§€λ§‰ 숫자 μœ„μΉ˜μ—μ„œ λͺ©ν‘œ 숫자 8을 λ§Œλ“€ 수 μžˆλŠ” λͺ¨λ“  방법을 DP ν…Œμ΄λΈ”μ— μ €μž₯된 κ°’μœΌλ‘œ 확인
μ½”λ“œλ‘œ μ„€λͺ…

1. 초기 μƒνƒœ:

  • dp[0][8] = 1 (첫 번째 숫자 8을 λ§Œλ“€ 수 μžˆλŠ” 경우의 μˆ˜λŠ” 1)

2. 첫 번째 단계 (i=1, nums[i]=3):

  • j=8일 λ•Œ:

    • j + nums[i] = 8 + 3 = 11 (20 μ΄ν•˜μ΄λ―€λ‘œ κ°±μ‹ )
    dp[1][11] += dp[0][8]  # dp[1][11] = 1
    • j - nums[i] = 8 - 3 = 5 (0 μ΄μƒμ΄λ―€λ‘œ κ°±μ‹ )
    dp[1][5] += dp[0][8]  # dp[1][5] = 1

3. 두 번째 단계 (i=2, nums[i]=2):

  • j = 11일 λ•Œ:
    • j + nums[i] = 11 + 2 = 13 (20 μ΄ν•˜μ΄λ―€λ‘œ κ°±μ‹ )
    dp[2][13] += dp[1][11]  # dp[2][13] = 1
    • j - nums[i] = 11 - 2 = 9 (0 μ΄μƒμ΄λ―€λ‘œ κ°±μ‹ )
    dp[2][9] += dp[1][11]  # dp[2][9] = 1
  • j = 5일 λ•Œ:
    • j + nums[i] = 5 + 2 = 7 (20 μ΄ν•˜μ΄λ―€λ‘œ κ°±μ‹ )
    dp[2][7] += dp[1][5]  # dp[2][7] = 1
    • j - nums[i] = 5 - 2 = 3 (0 μ΄μƒμ΄λ―€λ‘œ κ°±μ‹ )
    dp[2][3] += dp[1][5]  # dp[2][3] = 1

! μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ DP ν…Œμ΄λΈ” μ±„μš°κΈ° !

πŸ’» μ΅œμ’… μ½”λ“œ

n = int(input())
nums = list(map(int, input().split()))

# dp ν…Œμ΄λΈ” μ΄ˆκΈ°ν™”
dp = [[0] * 21 for _ in range(n)] # 0 이상 20 μ΄ν•˜μΈ μˆ«μžμ΄λ―€λ‘œ 크기가 21인 λ°°μ—΄

# 첫 번째 숫자λ₯Ό dp ν…Œμ΄λΈ”μ— μ΄ˆκΈ°κ°’μœΌλ‘œ μ„€μ •
dp[0][nums[0]] = 1

# dp ν…Œμ΄λΈ” μ±„μš°κΈ°
for i in range(1, n - 1):
    for j in range(21):
        if dp[i - 1][j]:
            if j + nums[i] <= 20: # λ”ν•˜κΈ°
                dp[i][j + nums[i]] += dp[i - 1][j]
            if j - nums[i] >= 0: # λΉΌκΈ°
                dp[i][j - nums[i]] += dp[i - 1][j]

# λ§ˆμ§€λ§‰ 숫자λ₯Ό λͺ©ν‘œ κ°’μœΌλ‘œ λ§Œλ“€ 수 μžˆλŠ” 경우의 수 좜λ ₯
print(dp[n-2][nums[-1]])

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant