728x90
반응형
문제 요약
- 알고리즘 분류: 동적계획법
- 난이도: Silver1
- 문제내용:
- 빨강, 초록, 파랑색의 N개 집이 있다. 그리고 각 집에 각 색에 칠하는 색의 비용이 있다.
- i번째와와 i-1, i + 1번째 색은 달라야 한다.
- 모든 집의 최소 비용으로 칠하는 비용을 구하여라
- 사이트 주소: https://www.acmicpc.net/problem/1149
1149번: RGB거리
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
문제풀이
문제 접근 방법
이 문제는 동적계획법이다. 그래서 점화식을 짜는 방법만 알면 된다.
위 그림은 예제 1번을 그림으로 표현한것이다. 2번째 집 부터 보면 레드는 1번째 블루와 그린 중 가장 작은 값이랑 더하고 저장 하면 된다. 블루는 1번째 레드와 그린중 가장 작은 값이랑 더하면된다. 그린은 1번째 레드와 블루중 가장 적은 값을 더해서 저장 하면된다. 3번째 도 이전 방식처럼 계속해서 모든 집 최소 가치 값을 더하면된다.
- 2번째 인덱스 부터 for문을 돌리면 된다.
- i 번째 레드는 i -1 번째 블루, 그린 중 작은 값을 더하면된다. 블루는 i - 1번째 레드, 그린 중 작은 값을 더하면된다. i -1 번째 그린은 레드, 블루 중 작은 값을 더하면된다.
- 최종 출력은 마지막 인덱스중 가장 작은 값이다.
CODE
Python
import sys
input = sys.stdin.readline
size = int(input())
houses = [list(map(int, input().split())) for _ in range(size)]
for i in range(1, size):
houses[i][0] += min(houses[i-1][1], houses[i-1][2])
houses[i][1] += min(houses[i-1][0], houses[i-1][2])
houses[i][2] += min(houses[i-1][0], houses[i-1][1])
print(min(houses[-1]))
Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int size = Integer.parseInt(br.readLine());
int[][] house = new int[size][3];
for(int i =0; i < size; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < 3; j++) {
house[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int i = 1; i < size; i++) {
house[i][0] += Math.min(house[i-1][1], house[i-1][2]);
house[i][1] += Math.min(house[i-1][0], house[i-1][2]);
house[i][2] += Math.min(house[i-1][1], house[i-1][0]);
}
System.out.println(Arrays.stream(house[size-1]).min().getAsInt());
}
}
728x90
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[BAEKJOON] 2744 대소문자 바꾸기 (0) | 2022.10.01 |
---|---|
[BAEKJOON] 11051 이항 계수 2 (1) | 2022.09.30 |
[BAEJOON] 1043 거짓말 (0) | 2022.09.25 |
[BAEKJOON] 3036 링 (2) | 2022.09.23 |
[BAEKJOON] 2981 검문 (0) | 2022.09.22 |