본문 바로가기
백준

RGB거리 2 - 17404번

by 청원뿔세포 2022. 9. 29.

RGB거리 - 1149번

위 문제와 비슷하지만 가장 마지막 집의 색이 가정 첫번째 집과는 달라야하는 다른점이 있다.

가장 첫번째 집이 선택됬는지 확인하면서 코드를 짤 필요가 있다.

각 색이 선택되었을 때 N번째 집까지 코드를 돌린 후, 선택한 색의 집을 뺀 나머지 두 집의 최소값을 저장한다.

그렇게 색 3가지를 모두돌린 후 각 색을 선택했을 때 나온 최소값 3개를 비교하여 가장 작은 수를 출력한다.

색을 선택하는 것을 코드화 할 때, 선택한 색을 제외한 나머지 색들은 1번 집에서 1001의 비용이 든다고 가정하면 무조건 선택이 되지 않을 것이다.

N번째 집까지 코드가 돌아가면 선택한 색을 빼고 나머지 2개의 색만 비교하면 된다.

 

처음에 입력받은 house를 복사하는 과정에서 얕은 복사를 사용하여 예제가 계속 틀리는 현상이 있었다.

copy 모듈의 deepcopy 를 사용하여 깊은 복사로 값만 복사해와야 한다.

 

 

import sys
import copy

n = int(sys.stdin.readline())
house = [[] for i in range(n+1)]

for i in range(n):
    house[i+1] = list(map(int, sys.stdin.readline().split()))


cost_red = copy.deepcopy(house)
cost_green = copy.deepcopy(house)
cost_blue = copy.deepcopy(house)

cost_red[1] = [house[1][0], 1001, 1001]
cost_green[1] = [1001, house[1][1], 1001]
cost_blue[1] = [1001, 1001, house[1][2]]

# red
for i in range(2,n+1):
    cost_red[i][0] += min(cost_red[i-1][1],cost_red[i-1][2])
    cost_red[i][1] += min(cost_red[i-1][0],cost_red[i-1][2])
    cost_red[i][2] += min(cost_red[i-1][1],cost_red[i-1][0])
red_min = min(cost_red[n][1], cost_red[n][2])

# green
for i in range(2,n+1):
    cost_green[i][0] += min(cost_green[i-1][1],cost_green[i-1][2])
    cost_green[i][1] += min(cost_green[i-1][0],cost_green[i-1][2])
    cost_green[i][2] += min(cost_green[i-1][1],cost_green[i-1][0])
green_min = min(cost_green[n][0], cost_green[n][2])


# blue
for i in range(2,n+1):
    cost_blue[i][0] += min(cost_blue[i-1][1],cost_blue[i-1][2])
    cost_blue[i][1] += min(cost_blue[i-1][0],cost_blue[i-1][2])
    cost_blue[i][2] += min(cost_blue[i-1][1],cost_blue[i-1][0])
blue_min = min(cost_blue[n][1], cost_blue[n][0])


print(min(red_min, green_min, blue_min))

 

'백준' 카테고리의 다른 글

분해합 - 2231번  (0) 2022.09.30
팰린드롬수 - 1259번  (0) 2022.09.30
RGB거리 - 1149번  (0) 2022.09.29
바이러스 - 2606번  (0) 2022.09.28
골드바흐의 추측 - 9020번  (0) 2022.09.27

댓글