[Baekjoon] 5557. 1ν•™λ…„

SungwooΒ·2025λ…„ 3μ›” 26일
0

Algorithm

λͺ©λ‘ 보기
42/43
post-thumbnail

πŸ“•λ¬Έμ œ

[Baekjoon] 5557. 1ν•™λ…„

문제 μ„€λͺ…

쀄 μ§€μ–΄μžˆλŠ” μˆ«μžκ°€ μ£Όμ–΄μ§ˆ λ•Œ 숫자 사이에 +ν˜Ήμ€ -λ₯Ό λ„£μ–΄ λ§ˆμ§€λ§‰ 수λ₯Ό λ§Œλ“€ 수 μžˆλŠ” μ˜¬λ°”λ₯Έ 등식을 λ§Œλ“œλ €κ³  ν•œλ‹€.
예λ₯Ό λ“€μ–΄ "8 3 2 4 8 7 2 4 0 8 8"μ—μ„œ
등식 "8+3-2-4+8-7-2-4-0+8=8"λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.
계산 쀑간에 λ‚˜μ˜€λŠ” μˆ˜κ°€ μŒμˆ˜μ΄κ±°λ‚˜ 20을 λ„˜κΈ°λ©΄ μ•ˆλ  λ•Œ, λ§Œλ“€ 수 μžˆλŠ” μ˜¬λ°”λ₯Έ λ“±μ‹μ˜ 개수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œλ‹€.

πŸ“ν’€μ΄

import sys
read = sys.stdin.readline

N = int(read())
nums = list(map(int, read().split()))

dp = [[0] * 21 for _ in range(N-1)]

dp[0][nums[0]] = 1

for i in range(1, N-1):
    for j in range(21):
        if j-nums[i]>=0: dp[i][j-nums[i]] += dp[i-1][j]
        if j+nums[i]<=20: dp[i][j+nums[i]] += dp[i-1][j]
print(dp[-1][nums[-1]])
  • 21*N-1 크기의 dp ν…Œμ΄λΈ” 생성.
    • ν–‰: λ§Œλ“€ 수 μžˆλŠ” 수 (0이상 20μ΄ν•˜λ§Œ μ·¨κΈ‰)
    • μ—΄: μž…λ ₯으둜 μ£Όμ–΄μ§„ 수
  • 첫번째 μ£Όμ–΄μ§„ 수λ₯Ό μ²΄ν¬ν•œ ν›„ 2ν–‰λΆ€ν„° dp μ‹œμž‘.
    i번째 μˆ˜λΆ€ν„° μ‹œμž‘ν•΄ 연산을 톡해 jλ₯Ό λ§Œλ“€ 수 μžˆλŠ”μ§€ 검사.
  • - ν˜Ήμ€ +λ₯Ό λ„£μ–΄μ„œ jλ₯Ό λ§Œλ“€ 수 μžˆμ„ λ•Œ
    이전 탐색을 톡해 κ΅¬ν•œ ν•΄λ‹Ή 숫자λ₯Ό λ§Œλ“€ 수 μžˆλŠ” κ°€μ§“μˆ˜λ₯Ό 더해 μ €μž₯.
  • λ§ˆμ§€λ§‰κΉŒμ§€ 탐색 ν›„ μ΅œμ’…μœΌλ‘œ ν•΄λ‹Ή 숫자(μ£Όμ–΄μ§„ λ§ˆμ§€λ§‰ 숫자)λ₯Ό λ§Œλ“€ 수 μžˆλŠ” κ°€μ§“μˆ˜λ₯Ό 좜λ ₯.

0개의 λŒ“κΈ€