[Java]プログラマDFS/BFS>ターゲット番号Java
プログラマ>DFS/BFS>ターゲット番号
https://programmers.co.kr/learn/courses/30/lessons/43165?language=java
質問する
で与えられた数字は20個未満です. 各数字は50より大きい自然数である. 目標は自然数が1000より大きいことです. I/O例
https://programmers.co.kr/learn/courses/30/lessons/43165?language=java
質問する
n個の非負の整数がある.順序を変更せずにこれらの整数を適切に追加または減算してターゲット番号を作成したいと思います.たとえば、[1,1,1,1,1,1]で数値3を作成するには、次の5つの方法があります.-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3
使用可能な数値の配列番号、ターゲット番号のターゲットをパラメータとして指定したときに、適切に数値を加算して減算して、ターゲット番号を作成する方法の数を返します.
せいげんじょうけん
-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3
I/O例
numberstargetreturn[1, 1, 1, 1, 1]35[4, 1, 2, 1]42
考える
この言葉がネットワークであることを簡単に理解すれば、メインラインに移動できるノードは1であり、別々のノードも1であり、すべて加算すればよい.computers[][]
アレイは2次元アレイであるが、実際には自分を境界とする場合、
下も上も、片方だけ見ればいいです.
したがって、visit[]
アレイは、computers.length
の長さの1次元アレイを生成することができる.
DFS
再帰を利用して実現した.
+と-の組み合わせなので、2つの組み合わせだけで構成されています.index
どうせ数字は積み重ねられていて、記号だけが変わります.index
は+1を変更しません.
以下、sum
において+と-を区別するためのsum + numbers[index]
sum - numbers[index]
、二つに分かればいいです.
これで、復帰して、数字ごとに+-を組み合わせることができます.target
のように、answer
が増加する.
必要な値を出力できます.
脱出条件はnumbers
配列を超えてはならないので、index
の値をnumbers
配列の長さと等しく設定した場合に戻る.
TMI
内容は複雑ではないが、2番目から復帰した人材はいつも頭が複雑だ.
手で直接使うのが最高!
コード#コード#
DFSの使用
class Solution {
static int numbers[];
static int target;
static int answer = 0;
static int length;
public int solution(int[] numbers, int target) {
this.numbers = numbers;
this.target = target;
this.length = numbers.length;
DFS(0, 0);
return answer;
}
static void DFS(int index, int sum) {
// 탈출 조건
if(index == length) {
if(sum == target) answer++;
return;
}
// 수행 동작
DFS(index + 1, sum + numbers[index]);
DFS(index + 1, sum - numbers[index]);
}
}
Reference
この問題について([Java]プログラマDFS/BFS>ターゲット番号Java), 我々は、より多くの情報をここで見つけました
https://velog.io/@lifeisbeautiful/Java-프로그래머스-DFSBFS-타겟-넘버-자바
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
この言葉がネットワークであることを簡単に理解すれば、メインラインに移動できるノードは1であり、別々のノードも1であり、すべて加算すればよい.
computers[][]
アレイは2次元アレイであるが、実際には自分を境界とする場合、下も上も、片方だけ見ればいいです.
したがって、
visit[]
アレイは、computers.length
の長さの1次元アレイを生成することができる.DFS
再帰を利用して実現した.
+と-の組み合わせなので、2つの組み合わせだけで構成されています.
index
どうせ数字は積み重ねられていて、記号だけが変わります.index
は+1を変更しません.以下、
sum
において+と-を区別するためのsum + numbers[index]
sum - numbers[index]
、二つに分かればいいです.これで、復帰して、数字ごとに+-を組み合わせることができます.
target
のように、answer
が増加する.必要な値を出力できます.
脱出条件は
numbers
配列を超えてはならないので、index
の値をnumbers
配列の長さと等しく設定した場合に戻る.TMI
内容は複雑ではないが、2番目から復帰した人材はいつも頭が複雑だ.
手で直接使うのが最高!
コード#コード#
DFSの使用
class Solution {
static int numbers[];
static int target;
static int answer = 0;
static int length;
public int solution(int[] numbers, int target) {
this.numbers = numbers;
this.target = target;
this.length = numbers.length;
DFS(0, 0);
return answer;
}
static void DFS(int index, int sum) {
// 탈출 조건
if(index == length) {
if(sum == target) answer++;
return;
}
// 수행 동작
DFS(index + 1, sum + numbers[index]);
DFS(index + 1, sum - numbers[index]);
}
}
Reference
この問題について([Java]プログラマDFS/BFS>ターゲット番号Java), 我々は、より多くの情報をここで見つけました
https://velog.io/@lifeisbeautiful/Java-프로그래머스-DFSBFS-타겟-넘버-자바
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
class Solution {
static int numbers[];
static int target;
static int answer = 0;
static int length;
public int solution(int[] numbers, int target) {
this.numbers = numbers;
this.target = target;
this.length = numbers.length;
DFS(0, 0);
return answer;
}
static void DFS(int index, int sum) {
// 탈출 조건
if(index == length) {
if(sum == target) answer++;
return;
}
// 수행 동작
DFS(index + 1, sum + numbers[index]);
DFS(index + 1, sum - numbers[index]);
}
}
Reference
この問題について([Java]プログラマDFS/BFS>ターゲット番号Java), 我々は、より多くの情報をここで見つけました https://velog.io/@lifeisbeautiful/Java-프로그래머스-DFSBFS-타겟-넘버-자바テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol