반응형
https://www.acmicpc.net/problem/1149
[풀이]
각 지붕에 대해 색을 칠할 수 있으며,
빨강, 노랑, 파랑 중 최소한의 비용으로 칠하고, 동시에 좌/우에 위치한 지붕과는 색깔이 달라야 한다.
일단 위의 사진에 있는 코드처럼 완탐으로 시도해보았다.
안되더라, 시간초과 뜨더라.
그래서 가지치기를 할 수 있는 방법에 대해 고민해보았다.
메모이제이션을 활용하였다.
[코드]
- Python
n = int(input())
color = [list(map(int, input().split())) for _ in range(n)]
dp = [[0] * 3 for _ in range(n)]
dp[0] = color[0][:]
for i in range(1, n):
dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + color[i][0]
dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + color[i][1]
dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + color[i][2]
print(min(dp[n - 1]))
- Java
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int[][] color = new int[n][3];
int[][] dp = new int[n][3];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
color[i][0] = Integer.parseInt(st.nextToken());
color[i][1] = Integer.parseInt(st.nextToken());
color[i][2] = Integer.parseInt(st.nextToken());
}
dp[0][0] = color[0][0];
dp[0][1] = color[0][1];
dp[0][2] = color[0][2];
for (int i = 1; i < n; i++) {
dp[i][0] = Math.min(dp[i - 1][1], dp[i - 1][2]) + color[i][0];
dp[i][1] = Math.min(dp[i - 1][0], dp[i - 1][2]) + color[i][1];
dp[i][2] = Math.min(dp[i - 1][0], dp[i - 1][1]) + color[i][2];
}
int result = Math.min(dp[n - 1][0], Math.min(dp[n - 1][1], dp[n - 1][2]));
System.out.println(result);
}
}
[시간복잡도]
시간복잡도: O(N)
공간복잡도: O(N)
반응형
'CS > Algorithm' 카테고리의 다른 글
[Python] 백준 33965번: 주사위 피라미드 (0) | 2025.05.23 |
---|---|
[Python] 백준 1347번: 미로 만들기 (3) | 2025.05.22 |
[Python/Java] 백준 10709번: 기상캐스터 (0) | 2025.05.21 |
[Python] 백준 10815번: 숫자 카드 (0) | 2025.05.21 |
[Python] 백준 15894번: 수학은 체육과목 입니다 (0) | 2025.05.21 |