본문 바로가기
코딩/백준-파이썬

백준 1149번: RGB 거리

by 철없는민물장어 2022. 7. 26.
728x90
반응형
"""
1번집: rgb중 가장 싼거
2번집: (1번집에서 안한색 中 가장싼거 + 1번집가격) or (2번집 중 가장싼거 + 2번집에서 안한 색 중 1번집 가장싼거) 둘 중 더 싼거
"""

n=int(input()) #집의 수
r=[]#빨간집을 칠하는 비용들
g=[]#초록집을 칠하는 비용들
b=[]#파란집을 칠하는 비용들
for i in range(n):
    R,G,B=map(int,input().split())
    r.append((R,0))
    g.append((G,1))
    b.append((B,2))
    #각 행의 1번 인덱스는 색을 표현함

data=[[0]*2 for i in range(n)]

def C_rgb(i):
    if r[i][0] < g[i][0]:
        if r[i][0]<b[i][0]:
            return r[i]
        else:
            return b[i]
    else:
        if g[i][0]<b[i][0]:
            return g[i]
        else:
            return b[i]

data[0][0],data[0][1]=C_rgb(0) #0번째 집은 가장 싼 집으로

for i in range(1,n):
    if data[i-1][1] == 0: #이전 집이 빨강인 경우
        if g[i][0]<b[i][0]: #초록과 파랑 비교
            data[i][0],data[i][1]=g[i]    
        else:
            data[i][0],data[i][1]=b[i]
    elif data[i-1][1] ==1: #이전 집이 초록인 경우
        if r[i][0]<b[i][0]: #빨강과 파랑 비교
            data[i][0],data[i][1]=r[i]    
        else:
            data[i][0],data[i][1]=b[i]
    elif data[i-1][1] ==2: #이전 집이 파랑인 경우
        if r[i][0]<g[i][0]: #빨강과 초록 비교
            data[i][0],data[i][1]=r[i]    
        else:
            data[i][0],data[i][1]=g[i]
    #이렇게해서 1번째 가장싼집+2번째(1번째집색제외) 가장싼집으로 설정
    
    #2번째케이스. 2번째 집 중 가장싼집 + (2번째에서 정한 색 제외)1번째집 가장싼집

    temp=C_rgb(i) 
    
    if temp[1] == 0: #2 집이 빨강인 경우
        if g[i-1][0]<b[i-1][0]: #초록과 파랑 비교
            if data[i-1][0]+data[i][0] > g[i-1][0] + temp[0]:
                data[i][0],data[i][1] = temp
                data[i-1][0],data[i-1][1] = g[i-1][0],g[i-1][1]     
        else:
            if data[i-1][0]+data[i][0] > b[i-1][0] + temp[0]:
                data[i][0],data[i][1] = temp
                data[i-1][0],data[i-1][1] = b[i-1][0],b[i-1][1]
    elif temp[1] ==1: #2 집이 초록인 경우
        if r[i-1][0]<b[i-1][0]: #빨강과 파랑 비교
            if data[i-1][0]+data[i][0] > r[i-1][0] + temp[0]:
                data[i][0],data[i][1] = temp
                data[i-1][0],data[i-1][1] = r[i-1][0],r[i-1][1]    
        else:
            if data[i-1][0]+data[i][0] > b[i-1][0] + temp[0]:
                data[i][0],data[i][1] = temp
                data[i-1][0],data[i-1][1] = b[i-1][0],b[i-1][1]
    elif temp[1] ==2: #2 집이 파랑인 경우
        if r[i-1][0]<g[i-1][0]: #빨강과 초록 비교
            if data[i-1][0]+data[i][0] > r[i-1][0] + temp[0]:
                data[i][0],data[i][1] = temp
                data[i-1][0],data[i-1][1] = r[i-1][0],r[i-1][1]    
        else:
            if data[i-1][0]+data[i][0] > g[i-1][0] + temp[0]:
                data[i][0],data[i][1] = temp
                data[i-1][0],data[i-1][1] = g[i-1][0],g[i-1][1]

print(data)
sum=0

for i in range(n):
    sum+=data[i][0]

print(sum)

능지 처참

 

개처참 

심지어 실패함

 


n = int(input())
rgb = []
for i in range(n):
    rgb.append(list(map(int, input().split())))
    #각 행의 0번인덱스-빨강 1번인덱스-초록 2번인덱스-파랑
for i in range(1, len(rgb)):
    rgb[i][0] = min(rgb[i - 1][1], rgb[i - 1][2]) + rgb[i][0] #i번째 집을 빨강으로 칠하는경우
    rgb[i][1] = min(rgb[i - 1][0], rgb[i - 1][2]) + rgb[i][1] #i번째 집을 초록으로 칠하는 경우
    rgb[i][2] = min(rgb[i - 1][0], rgb[i - 1][1]) + rgb[i][2] #i번째 집을 파랑으로 칠하는 경우
print(min(rgb[n - 1][0], rgb[n - 1][1], rgb[n - 1][2]))

이렇게 풀면됨

728x90
반응형

'코딩 > 백준-파이썬' 카테고리의 다른 글

백준 13549번: 숨바꼭질 3  (0) 2022.07.27
백준 2589번: 보물섬  (0) 2022.07.26
백준 16234번: 인구 이동  (0) 2022.07.26
백준 1654번: 랜선 자르기  (0) 2022.07.25
백준 16236번: 아기상어  (0) 2022.07.25

댓글