관리 메뉴

진취적 삶

RGB 거리 본문

알고리즘/다이나믹 프로그래밍 연습

RGB 거리

hp0724 2023. 6. 30. 12:53

bookmark

문제

RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.

집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.

  • 1번 집의 색은 2번 집의 색과 같지 않아야 한다.
  • N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.
  • i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.

입력

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.

나의풀이

n = int(input())

rgb = [[0] * 4 for _ in range(n + 1)]
dp = [[0] * 4 for _ in range(n + 1)]

for i in range(n):
    rgb[i][1], rgb[i][2], rgb[i][3] = map(int, input().split())
    min_value = min(rgb[i][1], rgb[i][2], rgb[i][3])
    idx = rgb[i].index(min_value)
    if i == 0:
        dp[i][idx] = min_value
    elif dp[i - 1][idx] == 0:
        dp[i][idx] = min_value
    elif dp[i - 1][idx] != 0:
        if idx == 1:
            min_value = min(rgb[i][idx + 2], rgb[i][idx + 1])
            new_index = rgb[i].index(min_value)
            dp[i][new_index] = min_value
        elif idx == 2:
            min_value = min(rgb[i][idx - 1], rgb[i][idx + 1])
            new_index = rgb[i].index(min_value)
            dp[i][new_index] = min_value
        elif idx == 3:
            min_value = min(rgb[i][idx - 1], rgb[i][idx - 2])
            new_index = rgb[i].index(min_value)
            dp[i][new_index] = min_value

sum = sum(sum(row) for row in dp)
print(sum)
# dp 전꺼랑 다르면서 최소값

초반 예시는 맞는데 뒤의 반례들이 틀림

모범답안

n = int(input())
costs = []

# 집의 비용 정보 입력받기
for _ in range(n):
    costs.append(list(map(int, input().split())))

# dp 테이블 초기화
dp = [[0] * 3 for _ in range(n)]
dp[0] = costs[0]  # 첫 번째 집의 비용은 그대로 초기화

# 동적 계획법을 사용하여 최소 비용 계산
for i in range(1, n):
    dp[i][0] = costs[i][0] + min(dp[i - 1][1], dp[i - 1][2])  # 현재 집을 빨강으로 칠할 경우
    dp[i][1] = costs[i][1] + min(dp[i - 1][0], dp[i - 1][2])  # 현재 집을 초록으로 칠할 경우
    dp[i][2] = costs[i][2] + min(dp[i - 1][0], dp[i - 1][1])  # 현재 집을 파랑으로 칠할 경우

# 최종적으로 마지막 집까지 칠하는데 드는 최소 비용
answer = min(dp[n - 1])

print(answer)

dp에 넣을 값과 cost에 넣을 값을 따로 따로 계산

현재 집을 빨강으로 칠하는경우 전에 집은 초록 파랑이여야 하니깐

min(dp[i - 1][1], dp[i - 1][2]) 이렇게 넣어주기

'알고리즘 > 다이나믹 프로그래밍 연습' 카테고리의 다른 글

1,2,3 더하기 3  (0) 2023.06.30
동물원  (0) 2023.06.30
오르막수  (0) 2023.06.30
스티커  (0) 2023.06.30
포도주 시식  (0) 2023.06.30