import java.util.Arrays;
public class BridgeCrossing
{
int n, min;
boolean[] a;
int[] times;
void go(int t, int num) {
for (int i = 0; i < n; i++) {
if (!a[i]) continue;
a[i] = false;
for (int j = i+1; j < n; j++) {
if (!a[j]) continue;
a[j] = false;
if (num==2 && t+times[j]<min) min = t+times[j];
for (int k = 0; k < n; k++) {
if (!a[k]) {
a[k] = true;
go(t+times[j]+times[k],num-1);
a[k] = false;
break;
}
}
a[j] = true;
}
a[i] = true;
}
}
public int minTime(int[] _times) {
if (_times.length == 1) return _times[0];
times = _times;
n = times.length;
min = 1000;
a = new boolean[n];
for (int i = 0; i < n; i++)
a[i] = true;
Arrays.sort(times);
go(0,n);
return min;
}
}
Problem
최대 6명의 사람이 최대 2명 밖에 건널 수 없는 낡은 다리를 건너야 한다. 어두운 밤이고 손전등은 한 개만 있다. 두 명이 건너고 난 후, 건넌 사람 중 한 명이 손전등을 주기 위해 다시 돌아가야 한다. 사람마다 건너는 시간이 같거나 다르며, 두 명의 사람이 같이 건널 때 더 시간이 오래 걸리는 사람의 시간이 걸린다. 모든 사람들이 다리를 건너는 최소 시간을 구하라.
Explanation
건널 때는 모든 사람 중 두 명을 뽑는 경우의 수를 구하고, 돌아올 때는 최소 시간을 가진 사람을 뽑으면 된다.
최근 덧글