// Fence Repair p.68 /** 널빤지 N개를 자르려고 한다. 필요한 길이는 L1, L2, L3는 배열로 주어진다. 널빤지 N개의 Ln의 길이로 자르려고 할 때 최소 비용을 구하라. N = 3, L = {8,5,8} 21을 13 과 8로 자르는 비용은 21 13을 5, 8로 자르는 비용 13 총 비용은 34다 탐욕 알고리즘으로 풀 수 있다. - 가장 짧은 널빤지 노드와 그 다음으로 짧은 널빤지의 노드는 형제면 된다. **/ import java.io.*; class Main { public static void main(String[] args) throws IOException { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int ans = 0, N = 3; int[] L = {8, 5, 8}; // 널빤지가 1개가 될때까지 while (N > 1) { // 가장 짧은 널빤지 mil1, 다음으로 짧은 널빤지 mil2를 구함. int mil1 = 0, mil2 = 1; if (L[mil1] > L[mil2]) { int tmp = mil1; mil1 = mil2; mil2 = tmp; } //3번째 배열부터 또 mil1, mil2보다 작은 것들이 있는지 확인하고 있다면 위치를 갱신한다. for (int i = 2; i < N; i++) { if (L[i] < L[mil1]) { mil2 = mil1; mil1 = i; } else if (L[i] < L[mil2]) { mil2 = i; } } // L[mil1] + L[mil2] 병합 (제일 작은 서로를 합침) int t = L[mil1] + L[mil2]; ans += t; bw.write("ans : " + ans + "\n"); if (mil1 == N - 1) { int tmp = mil1; mil1 = mil2; mil2 = tmp; } L[mil1] = t; // mil1을 합친값을 넣어서 커지게 만든다. (합쳐졌으니.) L[mil2] = L[N-1]; // mil2는 가장 큰 값을 넣는다. (왜지??) N--; } bw.write("ans : " + ans + "\n"); bw.close(); br.close(); }
2018년 7월 13일 금요일
[java] 탐욕알고리즘 연습 - 3
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기