본문 바로가기
코테연습

141. 구명 보트 Javascript

by hxunz 2022. 9. 16.

https://school.programmers.co.kr/learn/courses/30/lessons/42885

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 
  • 주어진 자료는 무엇인가?
     - 사람들의 몸무게를 담은 배열 people
     - 구명보트의 무게 제한 limit
     - 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없다.
  • 조건은 무엇인가?
     -
    무인도에 갇힌 사람은 1명 이상 50,000명 이하입니다.
     - 각 사람의 몸무게는 40kg 이상 240kg 이하입니다.
     - 구명보트의 무게 제한은 40kg 이상 240kg 이하입니다.
     - 구명보트의 무게 제한은 항상 사람들의 몸무게 중 최댓값보다 크게 주어지므로 사람들을 구출할 수 없는 경우는 없습니다.

2. 계획

  1. people 배열을 내림차순으로 정렬한다.
  2. 몸무게가 제일 무거운 사람과 제일 가벼운 사람을 더했을 때 limit를 초과한다면 그다음으로 몸무게가 제일 무거운 사람과 비교하고 count+1해준다. 
  3. 몸무게가 제일 무거운 사람과 제일 가벼운 사람을 더했을 때 limit를 초과하지 않는다면 그다음으로 몸무게가 제일 무거운 사람이랑 그 다음으로 몸무게가 제일 가벼운 사람이랑 비교하고 count+1을 해준다. 
  4. shift()나 pop()을 사용하지 않고 이를 사용한것처럼 인덱스만 옮겨가면서 비교해준것이다. 

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (people, limit) => {
  const peopleArr = people.sort((a, b) => b - a);

  let start = 0;
  let end = peopleArr.length - 1;
  let count = 0;

  while (start <= end) {
    if ((peopleArr[start] + peopleArr[end]) > limit) {
      start += 1;
      count++;
    } else {
      start += 1;
      end -= 1;
      count++;
    }
  }

  return count
}

test('countBoat', () => {
  expect(solution([70, 50, 80, 50], 100)).toEqual(3);
  expect(solution([70, 80, 50], 100)).toEqual(3);
})

 

댓글