일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 고모네 콩탕
- 다이나믹 프로그래밍
- mvc
- 2638
- 양꼬치
- 알고리즘
- 포두부 보쌈
- 1로 만들기
- Servlet
- 2589
- 2839
- Spring
- 설탕 배달
- HTTP API
- 2020 KAKAO BLIND
- 백준
- 호유동
- 동적 프로그래밍
- 쓰레드 풀
- 서블릿
- dp
- 투어
- 맛집 투어
- 프로그래머스
- BFS
- 스프링
- 문자열 압축
- 맛집
- 스프링 MVC
- 완도산회
- Today
- Total
프로그래밍 공방
[백준] 1149번 : RGB 거리 본문
문제 |
RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.
집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다.
각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.
- 1번 집의 색은 2번 집의 색과 같지 않아야 한다.
- N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.
- i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.
입력 |
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다.
둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다.
집을 칠하는 비용은 1,000보다 작거나 같은 자연수이다.
출력 |
첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.
문제해결방법 |
1번 집부터 N번 집까지 순서대로 칠한다고 가정해보자.
1번집은 왼쪽에 집이 없으므로 각각의 색으로 칠할 때 R1,G1,B1의 비용이 든다.
2번집 부터는 집을 각각의 색으로 칠할 때 왼쪽 집의 색에 대한 조건이 붙는다.
예를 들면, 2번 집에 빨간색을 칠하기 위해서는 1번 집이 파란 색이거나 초록색이어야 한다.
이를 식으로 나타내면, 아래와 같이 나타낼 수 있다.
2번 집에 빨간색을 칠하는 비용 = (G1 + R2) or (B1 or R2)
이 중 최소 비용을 선택해야 하므로 Min(G1, B1) + R2 가 된다.
위 과정을 N번 집까지 반복하면 모든 집을 칠하는 경우에서 최소 비용을 구할 수 있다.
POINT |
N번째 집이 각각의 색깔(R,G,B)로 칠해질 때 최소 비용을 만드는 일반항을 구해라.
코드 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package baekjoon; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main1149_RGB거리 { 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[][] RGB = new int[N][3]; for(int i=0; i<N; i++) { st = new StringTokenizer(br.readLine()); for(int j=0; j<3; j++) RGB[i][j] = Integer.parseInt(st.nextToken()); } for(int i=1; i<N; i++) { RGB[i][0] += Math.min(RGB[i-1][1], RGB[i-1][2]); RGB[i][1] += Math.min(RGB[i-1][0], RGB[i-1][2]); RGB[i][2] += Math.min(RGB[i-1][0], RGB[i-1][1]); } System.out.println(Math.min(RGB[N-1][0], Math.min(RGB[N-1][1], RGB[N-1][2]))); } } | cs |
코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.
'개발 > 문제해결' 카테고리의 다른 글
[백준] 14503번 : 로봇청소기 (0) | 2020.11.05 |
---|---|
[백준] 2606번 : 바이러스 (0) | 2020.11.05 |
[백준] 1197번 : 최소 스패닝 트리 (2) | 2020.11.02 |
[백준] 1068번 : 트리 (0) | 2020.11.02 |
[프로그래머스] 2020 KAKAO BLIND : 문자열 압축 (0) | 2020.11.01 |