Algorithm ( p & swlug )/Baekjoon

2ν•™λ…„ 2ν•™κΈ° μ•Œκ³ λ¦¬μ¦˜ 과제_1μ£Όμ°¨(λ°±μ€€_1932번:μ •μˆ˜ μ‚Όκ°ν˜•)

JU__DY 2024. 9. 24. 13:14

 πŸ“Œ 1μ£Όμ°¨ 과제 2

 

 

문제

        7
      3   8
    8   1   0
  2   7   4   4
4   5   2   6   5

μœ„ 그림은 크기가 5인 μ •μˆ˜ μ‚Όκ°ν˜•μ˜ ν•œ λͺ¨μŠ΅μ΄λ‹€.

맨 μœ„μΈ΅ 7λΆ€ν„° μ‹œμž‘ν•΄μ„œ μ•„λž˜μ— μžˆλŠ” 수 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν•˜μ—¬ μ•„λž˜μΈ΅μœΌλ‘œ λ‚΄λ €μ˜¬ λ•Œ, μ΄μ œκΉŒμ§€ μ„ νƒλœ 수의 합이 μ΅œλŒ€κ°€ λ˜λŠ” 경둜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ. μ•„λž˜μΈ΅μ— μžˆλŠ” μˆ˜λŠ” ν˜„μž¬ μΈ΅μ—μ„œ μ„ νƒλœ 수의 λŒ€κ°μ„  μ™Όμͺ½ λ˜λŠ” λŒ€κ°μ„  였λ₯Έμͺ½μ— μžˆλŠ” 것 μ€‘μ—μ„œλ§Œ 선택할 수 μžˆλ‹€.

μ‚Όκ°ν˜•μ˜ ν¬κΈ°λŠ” 1 이상 500 μ΄ν•˜μ΄λ‹€. μ‚Όκ°ν˜•μ„ 이루고 μžˆλŠ” 각 μˆ˜λŠ” λͺ¨λ‘ μ •μˆ˜μ΄λ©°, λ²”μœ„λŠ” 0 이상 9999 μ΄ν•˜μ΄λ‹€.

μž…λ ₯

첫째 쀄에 μ‚Όκ°ν˜•μ˜ 크기 n(1 ≤ n ≤ 500)이 μ£Όμ–΄μ§€κ³ , λ‘˜μ§Έ 쀄뢀터 n+1번째 μ€„κΉŒμ§€ μ •μˆ˜ μ‚Όκ°ν˜•μ΄ μ£Όμ–΄μ§„λ‹€.

좜λ ₯

첫째 쀄에 ν•©μ΄ μ΅œλŒ€κ°€ λ˜λŠ” κ²½λ‘œμ— μžˆλŠ” 수의 합을 좜λ ₯ν•œλ‹€.

 

 

 

 πŸ“Œ λ‚΄ 생각(풀이)

 

일단 문제λ₯Ό 보면 크기가 5인 μ •μˆ˜ μ‚Όκ°ν˜•μΈλ°, λ§¨μœ„μΈ΅ 7λΆ€ν„° μ•„λž˜ μˆ˜λ“€ 쀑 ν•˜λ‚˜λ₯Ό 택해 μ•„λž˜μΈ΅μœΌλ‘œ λ‚΄λ €μ˜¬ λ•Œ, μ„ νƒν•œ 수의 합이 μ΅œλŒ€κ°€ λ˜λ„λ‘ ν•΄μ•Όν•œλ‹€.

μ•„λž˜μΈ΅ μˆ˜λŠ” ν˜„μž¬ μΈ΅μ—μ„œ μ„ νƒλœ 수의 λŒ€κ°μ„  μ™Όμͺ½ λ˜λŠ” λŒ€κ°μ„  였λ₯Έμͺ½μ— μž‡λŠ” 것 μ€‘μ—μ„œλ§Œ 선택가λŠ₯ν•˜λ‹€.

ν•΄λ‹Ήλ¬Έμ œλŠ” λ°°μ—΄λ‘œν•΄μ„œ κ΅¬ν–ˆμ„λ•Œ μ΅œλŒ€κ°€ λ˜λŠ” 값을 κ΅¬ν•˜λ„λ‘ ꡬ성해야할 것 κ°™λ‹€.

νŒŒμ΄μ¬μ„ 풀거라면, for문을 ν†΅ν•΄μ„œ κ΅¬ν˜„μ„ ν•΄μ•Όν•  것 κ°™κ³ , 였λ₯Έμͺ½ λŒ€κ°μ„ κ³Ό 였λ₯Έμ‘± λŒ€κ°μ„  쀑 λˆ„μ μ„ ν•΄μ•Όν•˜λ―€λ‘œ appendν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•΄μ•Όν•  것이닀.

 

 

 πŸ“Œμ½”λ“œ 및 μ½”λ“œ 해석

# μž…λ ₯받을 숫자의 개수 n
n = int(input())

d = []
for i in range(n):
  
  # 각 ν–‰μ˜ μˆ«μžλ“€μ„ μž…λ ₯λ°›μ•„ λ¦¬μŠ€νŠΈμ— μΆ”κ°€ν•˜κΈ°
    d.append(list(map(int, input().split())))

# μ‚Όκ°ν˜•μ˜ 두 번째 ν–‰λΆ€ν„° μ‹œμž‘
for i in range(1, n):
    for j in range(len(d[i])):
        # 첫 번째 μ—΄ 처리: μœ„μ˜ ν–‰μ˜ 첫 번째 μ—΄κ³Ό λ”ν•˜κΈ°
        if j == 0:
            d[i][j] = d[i][j] + d[i-1][j]
        # λ§ˆμ§€λ§‰ μ—΄ 처리: μœ„μ˜ ν–‰μ˜ λ§ˆμ§€λ§‰ μ—΄κ³Ό λ”ν•˜κΈ°
        elif j == len(d[i]) - 1:
            d[i][j] = d[i][j] + d[i-1][j-1]
        # 쀑간 μ—΄ 처리: μœ„μ˜ 두 μ—΄ 쀑 큰 값을 λ”ν•˜κΈ°
        else:
            d[i][j] = max(d[i-1][j-1], d[i-1][j]) + d[i][j]

# λ§ˆμ§€λ§‰ ν–‰μ—μ„œ μ΅œλŒ€κ°’ 좜λ ₯ν•˜κΈ°
print(max(d[n-1]))

 

ν•΄λ‹Ή μ•Œκ³ λ¦¬μ¦˜μ€ λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μœΌλ‘œ ν’€μ–΄μ•Όν•œλ‹€.

이 μ½”λ“œλŠ” μ£Όμ–΄μ§„ 숫자둜 이루어진 μ‚Όκ°ν˜• ν˜•νƒœμ˜ 데이터λ₯Ό μž…λ ₯λ°›μ•„, κ°€μž₯ 큰 경둜의 합을 κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

 

ν•˜λ‚˜μ”© μ μ–΄κ°€λ©΄μ„œ κ·œμΉ™μ„ μ°Ύμ•„μ•Όν•œλ‹€.

d[0][0]=7
d[1][0]=3+7, d[1][1]=8+7
d[2][0]=8+d[1][0], d[2][1]=1+max(d[1][0],d[1][1]),
d[2][2]=0+d[1][1]

d[3][0]=2+d[2][0], d[3][1]=7+max(d[2][0],d[2][1]),
d[3][2]=4+max(d[2][1],d[2][2]), d[3][3]=4+d[2][2]

각 라인의 처음과 끝은 λ°”λ‘œ μœ„μ— 숫자λ₯Ό 더해주고, λ‚˜λ¨Έμ§€λŠ” μ™Όμͺ½ λŒ€κ°μ„ , 였λ₯Έμͺ½ λŒ€κ°μ„  쀑 μ΅œλŒ“κ°’μ„ λ”ν•΄λ‚˜κ°€ 계속 λˆ„μ ν•΄μ„œ λ”ν•΄κ°€λ„λ‘ν•΄μ•Όν•œλ‹€.

 

1) μž…λ ₯ν•˜κΈ°

n은 μ‚Όκ°ν˜•μ˜ ν–‰ 수λ₯Ό λ‚˜νƒ€λ‚΄κ³ , 이후 각 ν–‰μ˜ 숫자λ₯Ό μž…λ ₯λ°›μ•„ 2차원 리슀트 d에 μ €μž₯ν•œλ‹€.

 

2)경둜 ν•© κ³„μ‚°ν•˜κΈ°

  • μ‚Όκ°ν˜•μ˜ 두 번째 ν–‰λΆ€ν„° μ‹œμž‘ν•˜μ—¬ 각 μš”μ†Œμ˜ 값을 κ°±μ‹ 
  • 첫 번째 μ—΄μ˜ μš”μ†ŒλŠ” μœ„μ˜ ν–‰μ˜ ν•΄λ‹Ή μš”μ†Œλ§Œ λ”ν•˜κ³ ,
  • λ§ˆμ§€λ§‰ 열은 μœ„μ˜ ν–‰μ˜ λ§ˆμ§€λ§‰ μš”μ†Œμ™€ λ”ν•œλ‹€.
  • 쀑간 열은, μœ„μ˜ ν–‰μ—μ„œ ν•΄λ‹Ή μš”μ†Œμ˜ μ™Όμͺ½κ³Ό 였λ₯Έμͺ½μ˜ μ΅œλŒ€κ°’μ„ λ”ν•œλ‹€.
  • 이 과정을 톡해 ν•΄λ‹Ή 경둜의 μ΅œλŒ€ 합을 λ‚˜νƒ€λ‚Ό 수 있음.

 

3)κ²°κ³Ό 좜λ ₯ν•˜κΈ°

  • λ§ˆμ§€λ§‰ ν–‰μ—μ„œ κ°€μž₯ 큰 값을 μ°Ύμ•„ 좜λ ₯ν•œλ‹€. μ΄λŠ” μ‚Όκ°ν˜•μ˜ κΌ­λŒ€κΈ°μ—μ„œ λ°”λ‹₯κΉŒμ§€ λ‚΄λ €κ°€λŠ” 경둜 쀑 μ΅œλŒ€ 합을 λ‚˜νƒ€λ‚΄λ„λ‘ ν•œλ‹€.

 

 

 

이제 ν•™κΈ° μ‹œμž‘ν–ˆμœΌλ‹ˆκΉŒ μ—΄μ‹¬νžˆ μ•Œκ³ λ¦¬μ¦˜ 곡뢀λ₯Ό ν•΄μ•Όκ² λ‹€λŠ” 생각이 λ§ˆκ΅¬λ“€μ—ˆλ‹€..!

μ•Œκ³ λ¦¬μ¦˜ 과제 끝!

 

 

[참고 자료]

 

https://velog.io/@bye9/%EB%B0%B1%EC%A4%80%ED%8C%8C%EC%9D%B4%EC%8D%AC-1932-%EC%A0%95%EC%88%98-%EC%82%BC%EA%B0%81%ED%98%95

 

[λ°±μ€€/파이썬] 1932 μ •μˆ˜ μ‚Όκ°ν˜•

https://www.acmicpc.net/problem/1932λ‹€μ΄λ‚˜λ―Ήν”„λ‘œκ·Έλž˜λ°ν•˜λ‚˜μ”© μ μ–΄κ°€λ©΄μ„œ κ·œμΉ™μ„ μ°Ύμ•˜λ‹€.ex)d0=7d1=3+7, d1=8+7d2=8+d1, d2=1+max(d1,d1),d2=0+d1d3=2+d2, d3=7+max(d2,d2),d3=4

velog.io