Algorithm Problem/Python

[python] λ°±μ€€ - 4883. 삼각 κ·Έλž˜ν”„

deo2kim 2020. 9. 20. 20:12
λ°˜μ‘ν˜•

πŸ€”λ¬Έμ œ ν•΄κ²°

S1 | λ‹€μ΄λ‚˜λ―Ήν”„λ‘œκ·Έλž˜λ°

 

μ΅œμ†Œκ°€μ€‘μΉ˜? 라고 μƒκ°ν•΄μ„œ 별 생각없이 λ‹€μ΅μŠ€νŠΈλΌλ‘œ ν’€μ—ˆλ”λ‹ˆ λ°”λ‘œ μ‹œκ°„μ΄ˆκ³Ό

λ‹€μ‹œ μ½μ–΄λ³΄λ‹ˆ κ²½λ‘œκ°€ 각 μ§€μ λ§ˆλ‹€ λ‹¨μˆœν•΄μ„œ λ‹€μ΄λ‚˜λ―Ήν”„λ‘œκ·Έλž˜λ°μœΌλ‘œ ν‘ΈλŠ” λ¬Έμ œμ˜€λ‹€.

 

λ¬Έμ œμ—μ„œ 주어진 μ‚Όκ°κ·Έλž˜ν”„μ™€ λ˜‘κ°™μ€ 크기의 2μ°¨μ›λ¦¬μŠ€νŠΈλ₯Ό λ§Œλ“ λ‹€.

리슀트의 각 μš”μ†ŒλŠ” i,j에 도달 ν•  λ•Œμ˜ κ°€μž₯ μ΅œμ†Ÿκ°’μ„ μ €μž₯ν•œλ‹€.

 

이제 dp 값을 μ €μž₯ν•˜λŠ” 방법을 μ„€λͺ…ν•˜λ©΄ λ¨Όμ € 1ν–‰κΉŒμ§€λŠ” 직접 값을 μ±„μ›Œ λ„£κ³ , λ‚˜λ¨Έμ§€λŠ” for문을 λŒλ¦°λ‹€.

  • (1,0): (0,1)μ—μ„œ μ˜€λŠ” κ°’
  • (1,1): (0,1), (1,0)μ—μ„œ μ˜€λŠ” κ°’
  • (1,2): (0,1), (1,1),  (0,1)+(0,2)  μ—μ„œ μ˜€λŠ” κ°’

μ—¬κΈ°μ„œ μ€‘μš”ν•œκ±΄ λ…Έλž€μƒ‰μœΌλ‘œ ν‘œμ‹œν•œ μ € 뢀뢄이닀.

λ¬Έμ œμ—μ„œ 각 λ…Έλ“œμ˜ κ°€μ€‘μΉ˜λŠ” μ •μˆ˜μ΄λ‹€. λ‹€μ‹œ λ§ν•΄μ„œ μŒμˆ˜κ°€ ν¬ν•¨λ˜μ–΄ μžˆλ‹€λŠ” 뜻.(μ € λΆ€λΆ„ λ•Œλ¬Έμ— ν•œμ°Έ ν•΄λ§Έλ‹€)

7 -> 6 이 7 -> 5 -> 6 보닀 λ‹Ήμ—°νžˆ μž‘λ‹€

ν•˜μ§€λ§Œ 5κ°€ λ§Œμ•½ -5라면

6 -> -6 보닀 7 -> -5 -> 6이 더 μž‘λ‹€. κ·ΈλŸ¬λ―€λ‘œ μ΄λ ‡κ²Œ λŒμ•„μ„œ κ°€λŠ” κ²½λ‘œλ„ κ³„μ‚°ν•΄μ€˜μ•Ό ν•œλ‹€.

 

πŸ’¨  tip! λ¬Έμ œμ—μ„œ λ…Έλ“œμ˜ 값이 μ •μˆ˜λΌλŠ” 점

 

πŸ’»μ†ŒμŠ€ μ½”λ“œ

import sys


def solution(n, graph):
    dp = [[0] * 3 for _ in range(n)]

    dp[1][0] = graph[1][0] + graph[0][1]
    dp[1][1] = graph[1][1] + min(dp[1][0], graph[0][1], graph[0][2]+graph[0][1])
    dp[1][2] = graph[1][2] + min(dp[1][1], graph[0][1], graph[0][1] + graph[0][2])

    for i in range(2, n):
        for j in range(3):
            if j == 0:
                min_value = min(dp[i - 1][j], dp[i - 1][j + 1])
            elif j == 1:
                min_value = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i - 1][j + 1], dp[i][j - 1])
            else:
                min_value = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1])

            dp[i][j] = min_value + graph[i][j]

    print(f'{tc}. {dp[-1][1]}')


if __name__ == "__main__":

    tc = 0
    while True:
        a = int(input())
        if a == 0:
            break
        b = [list(map(int, sys.stdin.readline().split())) for _ in range(a)]
        tc += 1
        solution(a, b)


 

πŸ“•λ¬Έμ œ 확인

좜처: BACKJOON ONLINE JUDGE

링크: https://www.acmicpc.net/problem/4883

 

4883번: 삼각 κ·Έλž˜ν”„

μž…λ ₯은 μ—¬λŸ¬ 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ 이루어져 μžˆλ‹€. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 μ€„μ—λŠ” κ·Έλž˜ν”„μ˜ ν–‰μ˜ 개수 N이 주어진닀. (2 ≤ N ≤ 100,000) λ‹€μŒ N개 μ€„μ—λŠ” κ·Έλž˜ν”„μ˜ i번째 행에 μžˆλŠ” μ •μ μ˜ λΉ„μš©μ΄

www.acmicpc.net


문제

이 λ¬Έμ œλŠ” 삼각 κ·Έλž˜ν”„μ˜ κ°€μž₯ μœ„μͺ½ κ°€μš΄λ° μ •μ μ—μ„œ κ°€μž₯ μ•„λž˜μͺ½ κ°€μš΄λ° μ •μ μœΌλ‘œ κ°€λŠ” μ΅œλ‹¨ 경둜λ₯Ό μ°ΎλŠ” λ¬Έμ œμ΄λ‹€.

삼각 κ·Έλž˜ν”„λŠ” 사이클이 μ—†λŠ” κ·Έλž˜ν”„λ‘œ N ≥ 2 개의 ν–‰κ³Ό 3μ—΄λ‘œ 이루어져 μžˆλ‹€. 삼각 κ·Έλž˜ν”„λŠ” 보톡 κ·Έλž˜ν”„μ™€ λ‹€λ₯΄κ²Œ 간선이 μ•„λ‹Œ 정점에 λΉ„μš©μ΄ μžˆλ‹€. μ–΄λ–€ 경둜의 λΉ„μš©μ€ κ·Έ κ²½λ‘œμ—μ„œ μ§€λ‚˜κ°„ μ •μ μ˜ λΉ„μš©μ˜ 합이닀.

였λ₯Έμͺ½ 그림은 N = 4인 삼각 κ·Έλž˜ν”„μ΄κ³ , κ°€μž₯ μœ„μͺ½ κ°€μš΄λ° μ •μ μ—μ„œ κ°€μž₯ μ•„λž˜μͺ½ κ°€μš΄λ° μ •μ μœΌλ‘œ 경둜 쀑 μ•„λž˜λ‘œλ§Œ κ°€λŠ” 경둜의 λΉ„μš©μ€ 7+13+3+6 = 29κ°€ λœλ‹€. 삼각 κ·Έλž˜ν”„μ˜ 간선은 항상 였λ₯Έμͺ½ κ·Έλ¦Όκ³Ό 같은 ν˜•νƒœλ‘œ μ—°κ²°λ˜μ–΄ μžˆλ‹€.

μž…λ ₯

μž…λ ₯은 μ—¬λŸ¬ 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ 이루어져 μžˆλ‹€. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 μ€„μ—λŠ” κ·Έλž˜ν”„μ˜ ν–‰μ˜ 개수 N이 주어진닀. (2 ≤ N ≤ 100,000) λ‹€μŒ N개 μ€„μ—λŠ” κ·Έλž˜ν”„μ˜ i번째 행에 μžˆλŠ” μ •μ μ˜ λΉ„μš©μ΄ μˆœμ„œλŒ€λ‘œ 주어진닀. λΉ„μš©μ€ μ •μˆ˜μ΄λ©°, λΉ„μš©μ˜ μ œκ³±μ€ 1,000,000보닀 μž‘λ‹€.

μž…λ ₯의 λ§ˆμ§€λ§‰ μ€„μ—λŠ” 0이 ν•˜λ‚˜ 주어진닀.

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ, κ°€μž₯ μœ„μͺ½ κ°€μš΄λ° μ •μ μ—μ„œ κ°€μž₯ μ•„λž˜μͺ½ κ°€μš΄λ° μ •μ μœΌλ‘œ κ°€λŠ” μ΅œμ†Œ λΉ„μš©μ„ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ λ²ˆν˜Έμ™€ μ•„λž˜μ™€ 같은 ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€.

k. n

kλŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 번호, n은 μ΅œμ†Œ λΉ„μš©μ΄λ‹€.

λ°˜μ‘ν˜•