티스토리 뷰
728x90
반응형
문제
1번에서 N번까지 직선으로 나열되어 있는 집들의 색을 앞뒤로 위치한 이웃집과 겹치지 않게 RGB 중 한 가지 색으로 칠할 때 드는 비용의 최솟값을 구하는 문제이다.
이웃집과 색이 겹치는 경우는 최소비용이 들더라도 불가능하다. 예를 들어 R-R-G 나 R-G-B-B 등으로 칠할 수 없다.
풀이
- 서로 겹치지 않게 색칠하려면, 현재 위치(i)에서 초록색을 선택했을 경우 이전 위치(i-1)에는 빨간색이나 파란색을 선택해야 한다.
- i번째 집을 초록색으로 칠한다면 i까지의 최소 비용은 i-1번째 집이 빨간색과 파란색일 경우 중 더 작은 비용을 가진 색의 비용과 i번째 집의 초록색 비용을 더한 값이 된다.
- 모든 위치에서 앞집과 다른 색으로 최소비용을 계산해줌으로써 색이 겹치지 않게 집을 칠하는 비용의 최솟값을 도출할 수 있다.
- 이를 점화식으로 표현하면 다음과 같다.
- dp[i]["빨강"] = min(dp[i-1]["초록"], dp[i-1]["파랑"]) + RGB[i]["빨강"]
- dp[i]["초록"] = min(dp[i-1]["빨강"], dp[i-1]["파랑"]) + RGB[i]["초록"]
- dp[i]["파랑"] = min(dp[i-1]["빨강"], dp[i-1]["초록"]) + RGB[i]["파랑"]
알고리즘
- dp 리스트를 t 길이로 생성한다.
- 0번째 값은 이전 집이 없음으로 rgb 리스트와 동일하다.
- n-1번 반복하면서 점화식을 계산한다.
- 마지막 집에서 색의 비용을 비교하여 최소비용을 출력한다.
Python 코드
import sys
input = sys.stdin.readline
n = int(input())
rgb = [list(map(int, input().rstrip().split())) for _ in range(n)]
dp = [[0] * 3 for _ in range(n)] # 0으로 초기화
dp[0] = rgb[0]
for i in range(1, n):
dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + rgb[i][0] # 삘간색 0
dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + rgb[i][1] # 초록색 1
dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + rgb[i][2] # 파란색 2
print(min(dp[-1]))
문제 출처
728x90
반응형
'Study > Coding Test' 카테고리의 다른 글
[백준 BOJ / Python] 1965번 상자넣기 DP (0) | 2023.02.06 |
---|---|
[백준 BOJ / Python] 25338번 바지 구매 math (0) | 2023.02.01 |
[백준 BOJ / Python] 17404번 RGB거리 2 DP (0) | 2023.01.30 |
[백준 BOJ / Python] 1890번 점프 DP (1) | 2023.01.27 |
[백준 BOJ / Python] 2565번 전깃줄 DP (0) | 2023.01.18 |
댓글
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
TAG
- BFS
- dfs
- COLAB
- python
- DP
- lis
- 코딩테스트실력진단
- Look-ahead Mask
- greedy
- boj
- disjoint set
- 이분탐색
- Algorithm
- Transformer
- 그리디
- FastAPI
- Prefix sum
- 파이썬
- 알고리즘
- pytorch
- MySQL
- 구현
- padding mask
- 코딩테스트
- 누적합
- 코드트리
- 백준
- 트랜스포머
- 수학
- 분리집합
링크