[プログラマー]電話番号リスト(JAVA/Java)
13816 ワード
質問リンク
hashカテゴリに分類される問題であるが,
Trieとは?
探索木の一種で、文字列を迅速に探索できる資料構造である.
つまり、文字列を管理する方法の1つです.
問題例1を下図に示します.青いノードは最後の文字を表します.
trieインプリメンテーションは慣例に従って行われるのではなく,ノードクラスを定義することによってグラフィックを描画し,adjにサブノードを追加することによって実現される.
ルートノードから開始し、文字列の各文字を表示してサブノードを検索または新規作成します.初期ノード(now)=ルート nowノードのサブノードがない場合は、新しいサブノードを作成し、nowを新しいノードに置き換えます. nowノードのサブノードで、ノード(リーフ1)が現在検索する数値を持っている場合. 文字列の末尾を確認します. 終了ノードでない場合、nowをサブノードに置き換えます(leaf 1). エンドポイントの場合、接頭辞があるためfalseが返されます. に現在検索する文字がない場合は、サブノードを作成し、nowを新しいノードに置き換えます. の処理を容易にするために、文字列の各文字を表示する際に、数値で解析処理を意図的に行わなかった.(char形式を使用)
三輪車のコンセプトは毎日見ても忘れてしまいます.文字列を検索するときに有効な方法が見つかったらtrie! 他の人の解答を見ると、二重for文を使っていて、どうすれば問題を解決できるのかということでしたが、効率があまりよくないようでパスしました. ハッシュテーブル の使用方法について
いいえ
に答える
hashカテゴリに分類される問題であるが,
Trie(트라이)
概念を適用して解釈した.Trieとは?
探索木の一種で、文字列を迅速に探索できる資料構造である.
つまり、文字列を管理する方法の1つです.
問題例1を下図に示します.青いノードは最後の文字を表します.
119
を入れて1195524421
を入れると、1195524421
が119
の最後のノードを含んでいることがわかります!このような場合、接頭辞が存在すると考えられる.trieインプリメンテーションは慣例に従って行われるのではなく,ノードクラスを定義することによってグラフィックを描画し,adjにサブノードを追加することによって実現される.
ルートノードから開始し、文字列の各文字を表示してサブノードを検索または新規作成します.
コード#コード#
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
static class Node{
char num; // 노드가 가지는 값
ArrayList<Node> adj; // 자식 노드들의 list
boolean is_end; // 현재 노드가 한 문자열의 끝인지 여부
public Node(char num) {
this.num = num;
this.adj = new ArrayList<>();
this.is_end = false;
}
}
public static boolean solution(String[] phone_book) {
// 문자열의 길이 순서대로 오름차순 정렬
Arrays.sort(phone_book, (s1, s2)->s1.length()-s2.length());
// Arrays.sort(phone_book, (s1, s2)->s1.compareTo(s2)); // 이렇게 해도 가능
Node root = new Node('r'); // 루트 노드 생성
for (int i = 0; i < phone_book.length; i++) {
String s = phone_book[i];
Node now = root; // 루트부터 탐색
OuterLoop:
for (int j = 0; j < s.length(); j++) {
char c = s.charAt(j);
// 현재 노드의 자식 노드가 하나도 없으면
// 바로 새로운 노드를 생성하여 자식 노드로 이어주고
// now(현재 노드)를 방금 생성한 자식 노드로 바꿔준다.
if (now.adj.size()==0) {
Node new_node = new Node(c);
now.adj.add(new_node);
now = new_node;
if (j == s.length() - 1) { // j번째 문자가 마지막 문자라면
now.is_end = true;
}
continue;
}
// 현재 노드(now)의 자식 노드를 하나씩 확인
for (Node n : now.adj) {
if (n.num == c) {
if(n.is_end){ // 접두사가 있으면 바로 결과 리턴 (false)
return false;
}else{
now = n; // 현재 노드(now)를 자식노드로 바꿔주고 다시 탐색
continue OuterLoop;
}
}
}
// 현재 숫자 값을 가진 노드가 없으면 새로 생성한다.
Node new_node = new Node(c);
now.adj.add(new_node);
now = new_node;
if (j == s.length() - 1) {
now.is_end = true;
}
}
}
return true;
}
}
整理する
난이도 : LEVEL 2
🤦♀️ メモ
コメントサイト
いいえ
Reference
この問題について([プログラマー]電話番号リスト(JAVA/Java)), 我々は、より多くの情報をここで見つけました https://velog.io/@yanghl98/프로그래머스-전화번호-목록-JAVA자바テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol