-
[코딩테스트 javascript] 구명보트 - Greedy ,그리디, 탐욕알고리즘/코딩 테스트 2023. 2. 2. 21:45
구명보트
https://school.programmers.co.kr/learn/courses/30/lessons/42885
문제 설명
무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다.
예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 50kg]이고 구명보트의 무게 제한이 100kg이라면 2번째 사람과 4번째 사람은 같이 탈 수 있지만 1번째 사람과 3번째 사람의 무게의 합은 150kg이므로 구명보트의 무게 제한을 초과하여 같이 탈 수 없습니다.
구명보트를 최대한 적게 사용하여 모든 사람을 구출하려고 합니다.
사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 하도록 solution 함수를 작성해주세요.
풀이 1 - 75점 : 정확성 100, 효율성 0점
arr을 오름차순 정렬 후 for문을 돌면서 letf값 보다 큰지 확인한다.
function solution(people, limit) { //1. 내림차순 정렬 let arr = people.slice().sort((a,b)=>b-a); let boat = 0; let 구조됨 = 0; let 필요 = people.length; //2. (limin - v) 보다 큰 원소 찾기 for (let i=0;i<arr.length;i++){ if (arr[i]===300) continue; if (구조됨===필요) break; let left = limit - arr[i]; arr[i]=300;구조됨++; if (left>=Math.min(...arr)) { let index = arr.indexOf(Math.min(...arr)) arr[index]=300;구조됨++; } boat++; } return boat; }
틀린 이유
- arr의 최댓값은 50000이다.
- Math.min과 indexOf,array 변경 등 시간소비가 많다.
풀이 2
arr을 내림차순 정렬 후 while문을 돌면서 min을 확인해서 limit을 넘는지 확인한다.
function solution(people,limit) { const arr = people.slice().sort((a,b)=>b-a) let boat = 0; let l = 0, r = arr.length-1; while(l<r) { if (limit < arr[l] + arr[r]) { //보트는 최댓값 한명이 탄다. l++; } else{ //보트는 최댓값과 최저값이 탄다. l++;r--; } boat++; } if (l===r) { //한명만 남았을 경우 boat++ } return boat; }
'알고리즘 > 코딩 테스트' 카테고리의 다른 글
[코딩테스트] 프로그래머스 javascript 1단계 - 햄버거 만들기,둘만의 암호 ,개인정보 수집 유효기간,옹알이(2),문자열 나누기,신고결과 받기,성격유형 검사하기 (0) 2023.02.06 [코딩테스트] Softeer javascript - 금고털이, 장애물 인식 프로그램, 지도 자동구축, 전광판 (0) 2023.02.03 [코딩테스트 javascript] 큰 수 만들기 - Greedy ,그리디, 탐욕 (0) 2023.02.02 [코딩테스트 javascript] 조이스틱 - Greedy ,그리디, 탐욕,DFS,깊이 탐색 알고리즘, 그래프 탐색 알고리즘 (0) 2023.02.02 [코딩테스트 javascript] 체육복 - Greedy ,그리디, 탐욕 (0) 2023.02.02