백준 17404 RGB거리 2

Hyun·2023년 1월 28일
0

코딩테스트

목록 보기
17/66

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

0개의 댓글

관련 채용 정보