https://programmers.co.kr/learn/courses/30/lessons/42885
코딩테스트 연습 - 구명보트
무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5
programmers.co.kr
<내풀이>
너무 복잡하게 푼 것 같다. 먼저 오름차우순으로 정렬해줍니다.
1. 먼저 몇번째 인덱스 부터 limit의 1/2이 넘는지 확인합니다.
2. index의 의미는 limit/2인 것의 갯수 입니다. 그리고 limit/2보다 큰 수가 시작 되는 index 입니다.
3. limit/2작은 수중에서 가장 작은 수부터, limit/2보다 큰 수중에서 가장 큰수부터 차례대로 더해서 limit보다 작거나 같은 수가 있는지 찾습니다.
4. 그 수가 있다고 하면, 차례대로 짝을 찾습니다. 그러면, 짝은 찾지 못한 limit/2보다 작은 수와 큰수가 있는데, limit/2보다 작은 수들은 자기들끼리 2명씩 더하면 limit보다 작으므로 2로 나눕니다. 하지만, 홀수일 경우에는 하나 남은건 보트 하나가 되므로 나눈 것을 올림해 줍니다. count=limit/2보다 작은 수의 갯수 number=limit/2보다 큰수중에서 매칭 됐을 경우 시작하는 index를 매칭 된 것보다 -1해서 조정해줍니다.
5. 결과: answer에다가 남은 limit/2보다 작은 수들 그리고 짝지어지지 않은 limit/2보다 큰수들을 더해줍니다.
package algorithm_2;
import java.util.Arrays;
public class l14 {
public static int solution(int[] people, int limit) {
int answer = 0;
Arrays.sort(people);
int index=0;
for(int i =0; i<people.length;i++) {
if(people[i]>(double)limit/2) {
index=i;
break;
}
}
//limit/2보다 작은 것의 갯수: index
int number = people.length-1;
int count = index;
for(int j = 0; j<index;j++) {
for(int k = number ;k>=index;k--) {
if(people[j]+people[k]<=limit) {
count--;
answer++;
number=k-1;
break;
}
}
}
System.out.println(count);
answer+=(int)Math.ceil((double)count/2)+people.length-index-answer;
return answer;
}
public static void main(String[] args) {
int[] people = { 70, 50, 80, 50 }; int limit = 100;
/* int[] people = { 70, 80, 50 };
int limit = 100;*/
System.out.println(solution(people, limit));
}
}
<남풀이>
import java.util.Arrays;
class Solution {
public int solution(int[] people, int limit) {
Arrays.sort(people);
int i = 0, j = people.length - 1;
for (; i < j; --j) {
if (people[i] + people[j] <= limit)
++i;
}
return people.length - i;
}
}
아,,,이게 보면 참 이런게.ㅋㅋㅋㅋㅋ쉬워보여....ㅋㅋㅋㅋ생각하기가 힘드네요.ㅋㅋㅋㅋ
'컴퓨터 프로그래밍 > 알고리즘' 카테고리의 다른 글
프로그래머스-스킬트리 (0) | 2020.06.10 |
---|---|
프로그래머스-영어 끝말잇기 (0) | 2020.06.09 |
프로그래머스-쇠막대기 (0) | 2020.06.06 |
프로그래머스-예상 대진표 (0) | 2020.06.06 |
프로그래머스-기능개발 (0) | 2020.06.04 |