[アルゴリズム]プログラマー:救命ボート


プログラマー貪欲法:救命ボート


もんだいぶんせき

  • 艇は1回最大2人乗り、重量制限
  • ボートをできるだけ少なく使って、すべての人を救う
  • しゅろんり


  • 一番軽い人と一番重い人を縛って乗船させると使用する船の数が減ります.

  • 最も軽い→最も重い人の順に昇順に並べます

  • 最初のインデックス(最も軽い人)と最後のインデックス(最も重い人)をlimitと比較
  • 最小+最大>制限:一番重い人は他の人と一緒に乗るのも制限を超えているので、無条件で一人で乗船!
  • トラブルシューティング

    import java.util.*;
    
    class Solution {
        public int solution(int[] people, int limit) {
    	// 가장 가벼운->무거운 순으로 정렬
    	Arrays.sort(people);
    	int len = people.length;
    	int cnt = 0;
    	
    	// 최대한 가장 가벼운 사람 + 가장 무거운 사람의 조합으로 넣기 위해 양쪽 끝에서부터 이동
    	// 둘의 합이 limit을 초과하면 가장 무거운 사람은 나머지 다른 사람들과 같이 타도 무조건 limit 초과
    	int leftIdx = 0, rightIdx = len - 1;
    	int boat = 0;
    	while (cnt < len) {
    		if (people[leftIdx] + people[rightIdx] <= limit) {
    			leftIdx++; rightIdx--;
    			cnt += 2;
    		} else { 
    			rightIdx--;
    			cnt++;
    		}
    		boat++;
    	}
    	
    	return boat;
        }
    }

    注意事項

  • 最も軽い人+最も重い人の組み合わせでボートの数を最小限に抑えることができます
    さらに
  • の2つを加えて、限度を超えると一番重い人が船の中で一番軽い人を加えてしまうので、最終的に他の誰とも乗れないことが大事!