プログラマー-デジタルゲーム
8585 ワード
1.質問
質問リンク
説明:
xx社の2 xN名の従業員は2つのグループに分けられ、各グループはN名である.二つのチームはAチームとBチームです.デジタルゲームのルールは以下の通りです.
A組メンバーに付与された数参加順に並べられた配列Aとi組要素がB組のi組メンバーに付与された数の配列Bである場合は、解題関数を完了し、B組メンバーが得られる最大ポイントを返すようにしてください.
せいげんじょうけん
ABresult[5,1,3,7][2,2,6,8]3[2,2,2,2][1,1,1,1]0
I/O例説明
2.解答
ざっと近づく
B
のすべてのチームメンバーをリストするだけです.最大スコアを取得する方法.
ただし、チームメンバーがリストされている場合は、
N!
です.组员最多
100,000
人、ないでしょう...非常に近い
簡単に考えてみましょう.
そのため,一つの仮定によって証明する.
命題-
B
チームが最大点数を獲得するには、A
チームの高数字B
チームの高数字をカバーしなければならない.直観的には当たり前ですが、帰入法で近づけると、
仮に,
A
チームの低得点をB
チームの高得点に上書きすると,最大点数が得られる.矛盾--
A
チームの低得点をB
チームの低得点にカバーすると、より高い点数が得られます.たとえば
A = [11, 2, 2], B = [13, 3, 3]
の場合、A
上の2
はB
上の13
に覆われ、点数は2
である.A
上の2
がB
上の3
に上書きされた場合、スコアは3
である.まず良い武器を手に入れたでは、どのようにしてその上で実施するのでしょうか.
この問題は、直接ソートおよびダブルポインタ
O(N)
によってのみ解決できます.実際、
A
のチームメンバーの順序は固定されているため、調整する必要はありません.最高点数を得るためには、
A
チームメンバーをB
と一対一にマッチングさせることが重要です.次に、
A
およびB
を降順に並べます.A.sort((a, b) => b - a);
B.sort((a, b) => b - a);
今まで手に入れた武器(灰色で獲得した命題に近づく)を2つのポインタに関連付けられて実装されます.
let j = 0; // B를 가리키는 인덱스
let ans = 0; // 점수
for (let i = 0; i < A.length; i++) { // i는 A를 가리키는 인덱스
if (A[i] < B[j]) { // B가 더 클 때
ans++; // 점수 증가
j++; // B를 가리키는 인덱스 증가
}
}
以前に入手した武器によれば、A
の高い数値はB
の高い数値をカバーすることが望ましい.現在の
B
チームメンバーが所有している数値.A
チームメンバーの数を上書きできる場合、スコアが増加します.不可能なら、後ろの選手も点数を取ることはできない.
すべてのチームメンバーの数を表示するまで、この手順を繰り返します.
3.完全なコード
function solution(A, B) {
A.sort((a, b) => b - a);
B.sort((a, b) => b - a);
let j = 0; // B를 가리키는 인덱스
let ans = 0; // 점수
for (let i = 0; i < A.length; i++) { // i는 A를 가리키는 인덱스
if (A[i] < B[j]) { // B가 더 클 때
ans++; // 점수 증가
j++; // B를 가리키는 인덱스 증가
}
}
return ans;
}
この問題のレベルは3です.私は見るとすぐに答えが思いつくので簡単に解決できる問題です
個人的にはレベル2の難題がもっと多いと思います
難易度は相対的なので、レベルを問わず問題を解く姿勢が必要です.
Reference
この問題について(プログラマー-デジタルゲーム), 我々は、より多くの情報をここで見つけました https://velog.io/@front/프로그래머스-숫자-게임テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol