[Lv 2]目標番号
プログラマ
問題を理解する
n個の要素を持つnumbers要素を追加または減算してtargetを作成できる場合は、数を返す必要があります.各要素は+または-であるため、合計2^nの数値を作成できます.
DFS
ここで利用できる方法は,再帰関数を用いたDFS(深さ優先探索)アルゴリズムである.
1つのノードをブラウズした後、子ノードがなくなると、隣接する親ノードの兄弟ノードにアクセスします.子ノードは兄弟ノードでも参照され、子ノードがない場合は隣接する親ノードの兄弟ノードにアクセスします.
に答える
function solution(numbers, target) {
let answer = 0;
dfs(0,0);
function dfs(index, sum) {
if(index === numbers.length) {
if(sum === target) {
answer++
}
return;
}
dfs(index+1, sum+numbers[index]);
dfs(index+1, sum-numbers[index]);
}
return answer;
}
例
次に、
solution([1,1,1,1,1],3)
を実行する例を示す.🔍 最後のサブノードを確認
dfs関数の呼び出しに伴い、callスタックをチェックすると、生成されたdfs関数が順次スタックされ、最後のindex=5、sum=5であれば条件(
index===numbers.length
)に対応し、答え++となり、関数が返され、callスタックからポップアップされる.🔍 親兄弟ノードの最後のサブノードを確認
dfs(5,5)が返された後、callスタックにスタックされた最後の関数dfs(4,4)に対してdfs(4+1,4−1)が実行される.dfs(5,3)はすべての条件文を満たすので++と答えて返す.
👉 ここで、dfs(4,4)は、dfs(5,5)の親兄弟ノードに相当する.
🔍 すべてのノードのすべてのサブノードをチェック
各ノードの最後の+、最後の-が確認された場合、答えが返されます.
Reference
この問題について([Lv 2]目標番号), 我々は、より多くの情報をここで見つけました https://velog.io/@kaitlin_k/Lv2-타겟넘버テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol