BaekJoon
1149번:RGB거리[Java]
충 민
2022. 8. 30. 19:24
처음에 줄 수를 입력을 한 후 각 줄마다 R, G, B 숫자를 입력한다.
최소비용을 구하는데 인접한 집끼리는 색이 겹치면 안된다.
예를 들어 3번 집에 초록색을 칠한다면, 2번집과 4번 집은 초록색을 칠 할 수 없다.
이번 문제는 재귀를 이용하여 풀어보았다.
import java.util.*;
public class Main {
final static int r = 0;
final static int g = 1;
final static int b = 2;
static int[][] house;
static int[][] min;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=0;
n=sc.nextInt(); //줄수 입력받기
house = new int [n][3]; // n은 줄수 // 2차원 배열은 각 집의 비용
min = new int[n][3];
for(int i=0;i<n;i++){ //각 집들의 비용 입력받기
house[i][r]=sc.nextInt();
house[i][g]=sc.nextInt();
house[i][b]=sc.nextInt();
}
// min의 첫번째 값(집)은 각 색상비용의 첫번째 값으로 초기화
min[0][r] = house[0][r];
min[0][g] = house[0][g];
min[0][b] = house[0][b];
System.out.print(Math.min(sort(n- 1, r), Math.min(sort(n - 1, g), sort(n - 1, b))));
}
static int sort(int n, int color) {
// 만약 탐색하지 않은 배열이라면
if(min[n][color] == 0) {
// color의 색에 따라 이전 집의 서로 다른 색을 재귀호출하여 최솟값과 현재 집의 비용을 더해서 min에 저장한다
if(color == r) {
min[n][r] = Math.min(sort(n - 1, g), sort(n - 1, b)) + house[n][r];
}
else if(color == g) {
min[n][g] = Math.min(sort(n - 1, r), sort(n - 1, b)) + house[n][g];
}
else {
min[n][b] = Math.min(sort(n - 1, r), sort(n - 1, g)) + house[n][b];
}
}
return min[n][color];
}
}
정답이다.
Math.min을 이용하여 최솟값을 구해주면 제한시간안에 구할 수 있다.