[PS]ユニホーム(LV 1)
プログラマレベル2
大数
昼食の時間に盗まれ、一部の学生の運動服が盗まれた.幸いなことに、余分な運動服を貸したい学生がいます.学生の番号は体格順で、前の番号の学生か後ろの番号の学生の運動服しか貸せません.例えば、4番の学生は3番か5番の学生にしか運動服を貸すことができません.運動服がないと授業を受けられないので、適当に運動服を借りて、できるだけ多くの学生に体育の授業をさせなければなりません.
すべての学生の数n,ジャージを盗まれた学生の番号の並びloss,複数のジャージを持った学生の番号の並びreserveをパラメータとした場合,解関数を書いて体育の授業を受けられる学生の最上位値を返してください.
せいげんじょうけん
に答える
function solution(n, lost, reserve) {
// 일단 체육복 잃어버린사람중 여분이 있는지 체크한다
lost = lost.filter((e) => {
if (reserve.includes(e)) {
const temp = reserve.indexOf(e);
reserve.splice(temp, 1);
return false;
}
return true;
});
// 그 후 탐욕법 시작
// 일단 lost와 reserve에서 같은걸 비교하기위해 sort시켜준다
// 1. 여기서 문제가 처음발생했는데 얕은벅사로 인해서 for문의 반복이 줄어든만큼만 진행되는 에러..
// 2. 그래서 깊은복사를 시켜줌
const sortedLost = JSON.parse(JSON.stringify(lost.sort((a, b) => a - b)));
const sortedReserve = JSON.parse(JSON.stringify(reserve.sort((a, b) => a - b)));
// 깊은복사가 이뤄진 배열을 이용해 잃어버린 체육복을 돌린다
lost.forEach((e) => {
// 만약 +1, -1 인 숫자가있으면 정렬한 잃어버린 체육복 배열과 여분의 체육복 배열에서 splice시킨다.
if (sortedReserve.includes(e - 1)) {
sortedReserve.splice(sortedReserve.indexOf(e - 1), 1);
sortedLost.splice(sortedLost.indexOf(e), 1);
} else if (sortedReserve.includes(e + 1)) {
sortedReserve.splice(sortedReserve.indexOf(e + 1), 1);
sortedLost.splice(sortedLost.indexOf(e), 1);
}
});
// 최종적으로 정렬과 반복문이 끝난 잃어버린 체육복의 갯수를 계산하고
let lostCount = sortedLost.length;
// 전체학생의 수에서 감소시켜준다
return n - lostCount;
}
の最後の部分
貪欲法
上の解答が書いてあるように、最初は余計なチェックをした後、sortソートの配列でforeachを回しましたが、ずっといくつかの箱から飛び出していました
だからコンソールロゴで撮るときにforEachゲートがどのように回転しているかをチェックするので、ソート後の配列長が変化し、必要に応じて任意の長さを回転していないという問題が発生しました.
だから浅い放射線の問題だと思って、深放射をさせて、それから繰り返しのドアを返して、解決しました~
Reference
この問題について([PS]ユニホーム(LV 1)), 我々は、より多くの情報をここで見つけました https://velog.io/@sjy0917/체육복-LV1テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol