개발자가 말대꾸?
봄 백엔드 개발일기
개발자가 말대꾸?
전체 방문자
오늘
어제
  • 분류 전체보기 (42)
    • 알고리즘 공부 (13)
    • 디자인 패턴 공부 (1)
    • Spring (15)
      • Spring Boot (12)
      • Spring Data (1)
      • Spring Security (1)
    • Java (2)
    • MySQL (5)
    • EDITOR (3)
      • Intellij (3)
      • vscode (0)
    • 기타 (3)
      • 에러 (3)
      • 감상문 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 프로그래머스
  • BasicAuthenticationFilter
  • SpringBoot
  • GrantedAuthority
  • mysql
  • 프로그래머스 2단계
  • JPA
  • BasicAuthorization
  • intelliJ 단축키
  • spring
  • JPA Unique 제약조건
  • jsp
  • JPA 여러 컬럼 Unique
  • SpringSecurity 프로젝트
  • Java
  • Python
  • 권한 프로그래밍
  • RabbitMQ Kafka 차이
  • 라이브 템플릿
  • UserDetails 도메인
  • spring boot
  • JPA 여러 컬럼 유니크
  • IntelliJ
  • rest-api
  • 코드 템플릿
  • MSA 아키텍처에서 Config Server의 변경 사항을 MSA에게 전달하는 방법
  • Jpa 다중 제약조건 설정
  • 인텔리제이 좋은점
  • intellij live templates
  • 인텔리제이 사용법

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
개발자가 말대꾸?

봄 백엔드 개발일기

[자료구조] 트라이(Trie)
알고리즘 공부

[자료구조] 트라이(Trie)

2022. 5. 5. 21:27

https://programmers.co.kr/learn/courses/30/lessons/60060?language=java

 

코딩테스트 연습 - 가사 검색

 

programmers.co.kr

 

Trie 구현

 

먼저 Node 클래스를 만듭니다.

class Node {
    Map<Character, Node> childNodes = new HashMap<>();

    @Override
    public String toString(){
        return childNodes.keySet().toString();
    }
}


Node Class는 필드로 HashMap의 자식 노드를 가집니다.

자식 노드를 확인하기 위해 toString을 오버라이딩 해줍니다.

class Trie {

    Node rootNode = new Node();

    void insert(String s) {
        Node node = this.rootNode;

        for (int i = 0; i < s.length(); i++)
            node = node.childNodes.computeIfAbsent(s.charAt(i), key -> new Node());

    }

    boolean search(String s){
        Node node  = rootNode;

        for(int i = 0; i < s.length(); i++){

            node = node.childNodes.getOrDefault(s.charAt(i), null);

            System.out.print(node + " ");

            if(node == null)
                return false;
        }

        return true;
    }
}


Trie는 필드로 루트노드를 가집니다.

insert와 search를 구현했습니다.

 

insert

void insert(String s) {
        Node node = rootNode;

        for (int i = 0; i < s.length(); i++)
            node = node.childNodes.computeIfAbsent(s.charAt(i), key -> new Node());

    }

 

변수로 최상위 노드를 가집니다.

computeIfAbsent는 key를 찾아보고 해당하는 key가 있다면 value를 줍니다.

해당하는 key가 없다면 backupFunction을 실행하는데, 위 코드에서 backupFunction은 람다식으로 정의되어있습니다.

new Node() 즉 새로운 노드를 만듭니다.

그 결과 값을 node에 저장합니다. 여기서 결과 값은 ( key의 value 혹은 new Node()입니다. )

이것을 매개변수 s의 길이 만큼 반복합니다.

S가 "Hello" 일때를 예로 들겠습니다.

 

만약 "Hero"를 insert한다면



ComputeIfAbsent에서 Absent(부재)가 아님으로 new Node()를 만들지 않고 node변수를 E로 초기화 시킵니다.

"HER"을 insert한다면


이미 H의 자식 'E', E의 자식 'R'이 존재함으로 Node를 만들지 않습니다.

"HER"은 이미 있는 노드입니다.



search

 

boolean search(String s){
        Node node  = rootNode;

        for(int i = 0; i < s.length(); i++){

            node = node.childNodes.getOrDefault(s.charAt(i), null);

            System.out.print(node + " ");

            if(node == null)
                return false;
        }

        return true;
    }

 

마찬가지로 rootNode에서 시작합니다.

node의 자식노드를 찾습니다.

getOrDefault는 매개변수로 key와 default값을 받습니다.

key가 존재할 경우 value를 리턴하고 존재하지 않을 경우 default 값을 반환하게 됩니다.

즉 위의 코드로 본다면 해당 문자에 해당하는 key가 없다면 null을 반환하며 node가 null일 경우 false를 리턴합니다.

for문을 무탈하게 통과하면 true를 리턴합니다.

여기서 응용을 하려면 Node의 필드로 boolean 타입의 endOfWord를 가지게하고 현재 노드가 정점인지 확인할 수 있습니다.


"HEART"을 search하는 과정

정점에서 시작합니다.

ROOT -> 'H'


H -> 'E'




여기서 E -> 'A'를 해야되는데 A노드가 보이지 않습니다.

node = node.childNodes.getOrDefault(s.charAt(i), null);​



getOrDefault에서 default 값으로 null을 주었으니 node = null이 될 것입니다.

if(node == null)
    return false;

이렇게 false를 반환합니다.

 

 

 

'알고리즘 공부' 카테고리의 다른 글

Least Recently Used 자료구조 구현 Java  (0) 2022.05.18
[자료구조] 트리(Tree)  (0) 2022.05.08
프로그래머스 스택/큐 : [프린터] JAVA 풀이  (0) 2022.05.02
프로그래머스 3단계/효율성 : [숫자 게임] Java 풀이  (0) 2022.05.01
프로그래머스 스택/큐 : [기능개발] Java 풀이  (0) 2022.04.30
    '알고리즘 공부' 카테고리의 다른 글
    • Least Recently Used 자료구조 구현 Java
    • [자료구조] 트리(Tree)
    • 프로그래머스 스택/큐 : [프린터] JAVA 풀이
    • 프로그래머스 3단계/효율성 : [숫자 게임] Java 풀이
    개발자가 말대꾸?
    개발자가 말대꾸?
    - ing9990.com - 열정적인 ENTP - 주말 코딩, 퇴근 코딩 ing9990

    티스토리툴바