プログラマー-島接続
5658 ワード
島接続(2021、07.30)Connect Island
質問と回答アドレス
Programmers
Git Solution
問題の説明
n個の島の間に橋を建設する費用(費用)については、すべての島が最小の費用で互いに通行できるようにする解決策を完了し、必要な最小の費用を返してください.
橋を何度も渡っても、たどり着けば通行できます.例えば、A島とB島の間に橋があり、B島とC島の間に橋があれば、A島とC島は互いに通行することができる.
せいげんじょうけん
ncostsreturn4[[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]]4
I/O例説明
コストは下図のように、緑のパス接続を使用すると、すべての人が通過できるように最小限のコストで使用できます.
トラブルシューティング
この問題はテーマ貪欲法を含め,多様なアルゴリズムが必要である.(またシャベルを1本投げた…)必要なアルゴリズムは次のとおりです.
クルーズアルゴリズム
クルーズアルゴリズムの実現方式
사이클
は作成すべきでない形になります(A->B<->C).したがって、動作は発生しません.推測イベントと解決策
初期には、私はクルーズアルゴリズムを使わず、定義した条件を絶えず追加することで解いた.△間違ったやり方とは言えないが、条件はますます厳しくなっている.ループを作成しない方法を開始値と終了値の2つに分けて処理し、コンテキストループを作成するために条件値を追加しました.多くのテストケースが追加され、実際のテストケースで条件が作成されましたが、いずれも失敗します.条件ごとに状況によって異なるので,この方式は不可能であることに気づく.
≪イベント|Events|ldap≫
トラブルシューティング
クルースカアルゴリズムを用いた.
最上位の親ノードを検索するコードは次のとおりです.
// 재귀함수를 사용하여 -1값이 나올때까지
private int findRoot(int child, int[] visitArr) {
if(child == visitArr[child]){
return child;
}else if (visitArr[child] == -1) {
return child; // 기존 부모값 사용
} else {
return findRoot(visitArr[child], visitArr);
}
}
アクセス配列に値を設定する条件は次のとおりです.// 순서가 상관없으므로 두 root값을 모두 비교해야한다.
// 큰값이 방문배열 Index, 작은값이 방문배열 Value
if(startRoot > endRoot){
visitArr[startRoot] = endRoot;
}else{
visitArr[endRoot] = startRoot;
}
// 양쪽 부모가 같지 않으므로 연결이 가능하므로 연산한다.
answer += cost[2];
テスト結果
試験番号通過有無メモリと時間試験番号通過有無メモリと時間試験番号通過(11.49 ms,53.5 MB)試験5通過(6.98 ms,52.8 MB)試験2通過(4.35 ms,52.3 MB)試験6通過(6.56 ms,52.4 MB)試験3通過(4.39 ms,53.3 MB)試験7通過(12.55 ms,52.1 MB)試験4通過(9.10 ms,53.3 MB)試験8通過(6.82 ms,52.1 MB)
ポスト
この問題は明確なアルゴリズム(クルスカ)を用いず,条件を設定すれば解決できる.相応の条件を考慮したが,依然として脆弱性があり,所望の結果は得られなかった.
Reference
この問題について(プログラマー-島接続), 我々は、より多くの情報をここで見つけました https://velog.io/@mertyn88/프로그래머스-섬연결テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol