[실버1]백준 1149번(RGB거리) - 코테공부 29일차(2025.02.20)
2025. 2. 20. 12:48
반응형


문제유형
수학
풀이 방법 도출 과정
1. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구하는 것이 문제
- i-1과 i+1 과 i는 각각 색이 같으면 안됨
3. 각 비용이 낮은 것을 찾으면 됨 단, 이동하면서 칠하기 때문에 잘생각해야함
4. 만약 이렇게 있을 경우
5.
26 40 83
49 60 57
13 89 99
1) 26 2) 57 3) 13이렇게 해서 96이렇게 구해나가면 된다.
6. 이 문제는 현재 집을 칠하는 비용을 이전 집들의 최소 비용과 연계하여 계산해야 하므로, 재귀 함수를 활용한 해결이 가능하다. 즉, 집 i를 칠하는 비용은 i-1번째 집까지의 최소 비용을 고려한 결과로 나타낼 수 있다. 이를 통해, 각 집을 칠하는 최소 비용을 구하는 함수를 작성할 수 있다.
시간 복잡도
시간 복잡도는 DP알고리즘 , for문이 있다. 그 결과 시간복잡도는 O(3n)인데 이는 즉O(n)이므로 괜찮은 시간복잡도를 가지고 있다.
코드 및 간단설명
사칙연산을 활용한 문제이다.
N = int(input())
# DP 테이블 초기화 (0으로 채운 N x 3 배열)
dp = [[0] * 3 for _ in range(N)]
# 비용 입력
lst = [list(map(int, input().split())) for _ in range(N)]
# 첫 번째 집의 비용을 그대로 가져옴
dp[0] = lst[0]
# DP 테이블 갱신
for i in range(1, N):
for j in range(3):
dp[i][j] = lst[i][j] + min(dp[i - 1][(j + 1) % 3], dp[i - 1][(j + 2) % 3])
# 최솟값 출력
print(min(dp[N - 1]))
다른 풀이
1) DP 알고리즘 최적화
더욱 더 나은 방법으로 DP를 사용하는 방법이 있다.
N = int(input())
# 첫 번째 집의 비용을 입력받아 초기 상태로 사용
prev = list(map(int, input().split()))
# 두 번째 집부터 입력받으며 이전 상태만 이용
for _ in range(1, N):
cost = list(map(int, input().split()))
# 현재 집의 각 색상에 대해 누적 최소 비용 계산
curr = [0] * 3
curr[0] = cost[0] + min(prev[1], prev[2])
curr[1] = cost[1] + min(prev[0], prev[2])
curr[2] = cost[2] + min(prev[0], prev[1])
# 현재 상태를 이전 상태로 갱신
prev = curr
# 마지막 집의 최소 비용 출력
print(min(prev))
반응형
'Coding Test (코딩 테스트)' 카테고리의 다른 글
[골드5]백준 9251번(LCS) - 코테공부 31일차(2025.02.23) (0) | 2025.02.23 |
---|---|
[실버2]백준 11053번(가장 긴 증가하는 부분 수열) - 코테공부 30일차(2025.02.21) (0) | 2025.02.21 |
[브론즈2]백준 15829번(Hashing) - 코테공부 29일차(2025.02.20) (0) | 2025.02.20 |
[실버2]백준 11048번(이동하기) - 코테공부 28일차(2025.02.19) (0) | 2025.02.19 |
[골드4]백준 1461번(웰컴 키트) - 코테공부 28일차(2025.02.19) (0) | 2025.02.19 |