본문 바로가기
알고리즘/programmers

42885: 구명보트[그리디]

by cjw.git 2021. 1. 5.

Link : programmers.co.kr/learn/courses/30/lessons/42885


1. 문제

  • 무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다.
    예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 50kg]이고 구명보트의 무게 제한이 100kg이라면 2번째 사람과 4번째 사람은 같이 탈 수 있지만 1번째 사람과 3번째 사람의 무게의 합은 150kg이므로 구명보트의 무게 제한을 초과하여 같이 탈 수 없습니다.
    구명보트를 최대한 적게 사용하여 모든 사람을 구출하려고 합니다.
    사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 하도록 solution 함수를 작성해주세요.

 


2. 문제의 조건

  • 1 <= 사람 <= 50,000
  • 40 <= 몸무게, 무게 제한 <= 240
  • 구명보트의 무게 제한은 사람의 몸무게 중 최대값보다 크게 주어진다.
    사람들을 구출할 수 없는 경우는 없음.
  • 2명씩만 탈 수 있음.

 


더보기

3. 문제 접근

  • 시간 복잡도

    추후 보강

 

  • 아이디어

    2명밖에 탈 수 없다는 것이 문제에 주어져있으므로, 제일 높은 kg와 제일 낮은 kg를 상태로 진행하면 된다고 생각하였습니다.
    stack + queue를 이용해도 되지만, 연산이 생각보다 많으므로 투포인터 기술을 활용하자고 생각하였습니다.

 


4. 풀이 방법

  • 사람들을 내림차순으로 몸무게 별로 정렬한다.
  • 시작지점은 0번째 끝지점은 len(people) - 1부터 시작한다.
  • 만약 s_tp의 몸무게 + e_tp의 몸무게가 한계보다 적으면 둘 다 태울 수 있으므로 s_tp++; e_tp--l; 를 수행한다.
    만약 아니라면 s_tp의 몸무게가 너무 큰 것이므로 s_tp만 1개 증가한다.

 


5. 소스코드

 


 

cjw.git@gmail.com

'알고리즘 > programmers' 카테고리의 다른 글

42238: 입국심사[이분탐색]  (0) 2021.01.06
43165: 타겟 넘버[DFS/BFS]  (0) 2021.01.05
42583: 다리를 지나는 트럭[스택/큐]  (0) 2021.01.05
42586: 기능개발[스택/큐]  (0) 2021.01.05
42584: 주식가격[스택/큐]  (0) 2021.01.05

댓글