https://www.acmicpc.net/problem/17404
실패이유
: 구현실패
n = int(input())
p = [[0, 0, 0]] + [list(map(int, input().split())) for _ in range(n)]
d = [[0] * 3 for _ in range(1001)]
ans = 1000 * 1000 + 1
for s in range(3): # 첫번째 집의 색을 설정하기 위한 for문
for i in range(3): # 첫번째 집의 색을 고정
if s == i:
d[1][i] = p[1][i]
else:
d[1][i] = 1000 * 1000 + 1
for i in range(2, n + 1): # 직선 형태의 거리라 생각하고 계산
d[i][0] = min(d[i - 1][1], d[i - 1][2]) + p[i][0]
d[i][1] = min(d[i - 1][0], d[i - 1][2]) + p[i][1]
d[i][2] = min(d[i - 1][0], d[i - 1][1]) + p[i][2]
for i in range(3):
if s != i: # 첫번째 집과 마지막 집의 색이 다른 경우에 대해서만 최소비용 계산
ans = min(ans, d[n][i])
print(ans)
- 첫 번째 집과 마지막 집이 이웃하는 경우 (원 형태의 거리)
- 첫 번째 집의 색을 정해주고 마지막 집 색이 다른 모든 경우의 수에 대해
- 최소 비용을 계산해야 한다.
- 이때 계산하는 최소비용은 첫 번째 집과 마지막 집 색이 같을 수도 있는 직선 형태의 거리의 최소비용이다.
- 따라서 첫 번째 집의 색과 마지막 집 색이 다른 경우엔 최소비용을 갱신하지 않는다.
for i in range(3): if s != i: # 첫번째 집과 마지막 집의 색이 다른 경우에 대해서만 최소비용 갱신 ans = min(ans, d[n][i])
- 첫 번째 집 색, 마지막 집 색 경우의 수
R , G
R , B
G , R
G , B
B , R
B , G
총 6개의 경우의 수
- 첫 번째 집의 색을 정해주는 방법
- 선택한 첫 번째 집의 색을 제외한 나머지 첫 번째 색의 비용을 1000*1000+1 로 설정한다.
for s in range(3): # 첫번째 집의 색을 설정하기 위한 for문 for i in range(3): # 첫번째 집의 색을 고정 if s == i: d[1][i] = p[1][i] else: d[1][i] = 1000 * 1000 + 1
출처 : 코드플러스 - 알고리즘 기초 1/2 강의
https://code.plus/course/41