개발하는 사막여우
개발하는 사막여우
개발하는 사막여우
전체 방문자
오늘
어제
  • All (310)
    • Books (13)
      • 읽기 좋은 코드가 좋은 코드다 (13)
    • Study (6)
      • Blockchain (3)
      • Algorithm (3)
    • Baekjoon (36)
    • Programmers (166)
    • LeetCode (15)
    • Open Source (1)
      • Youtube Popout Player (1)
    • Language (32)
      • Python (9)
      • JS (8)
      • Java (5)
      • HTML (6)
      • CSS (4)
    • Library & Framework (15)
      • React.js (15)
    • IDE (2)
      • IntelliJ (2)
    • Airdrop (9)
    • Tistory (2)
    • etc.. (12)
      • Cozubi (6)
      • lol-chess (0)

블로그 메뉴

  • Github

공지사항

인기 글

태그

  • 클린 코드 작성법
  • 프로그래머스
  • 파이썬
  • 카카오 공채
  • 코딩테스트연습
  • 알고리즘문제풀이
  • 읽기 좋은 코드가 좋은 코드다
  • 코인줍줍
  • 백준
  • 신규 코인 에어드랍
  • Cozubi
  • 코주비
  • Python
  • 클린 코드
  • programmers
  • Java
  • 카카오 코딩테스트
  • 2018 KAKAO BLIND RECRUITMENT
  • 프로그래머스 위클리 챌린지
  • 카카오 알고리즘 문제

최근 댓글

최근 글

티스토리

반응형
hELLO · Designed By 정상우.
개발하는 사막여우

개발하는 사막여우

[프로그래머스] [3차] 자동완성 / Java
Programmers

[프로그래머스] [3차] 자동완성 / Java

2021. 3. 11. 18:34
반응형

문제주소 :programmers.co.kr/learn/courses/30/lessons/17685

 

코딩테스트 연습 - [3차] 자동완성

자동완성 포털 다음에서 검색어 자동완성 기능을 넣고 싶은 라이언은 한 번 입력된 문자열을 학습해서 다음 입력 때 활용하고 싶어 졌다. 예를 들어, go 가 한 번 입력되었다면, 다음 사용자는 g

programmers.co.kr


<문제 설명>

더보기

문제 설명

자동완성

포털 다음에서 검색어 자동완성 기능을 넣고 싶은 라이언은 한 번 입력된 문자열을 학습해서 다음 입력 때 활용하고 싶어 졌다. 예를 들어, go 가 한 번 입력되었다면, 다음 사용자는 g 만 입력해도 go를 추천해주므로 o를 입력할 필요가 없어진다! 단, 학습에 사용된 단어들 중 앞부분이 같은 경우에는 어쩔 수 없이 다른 문자가 나올 때까지 입력을 해야 한다.
효과가 얼마나 좋을지 알고 싶은 라이언은 학습된 단어들을 찾을 때 몇 글자를 입력해야 하는지 궁금해졌다.

예를 들어, 학습된 단어들이 아래와 같을 때

go gone guild

  • go를 찾을 때 go를 모두 입력해야 한다.
  • gone을 찾을 때 gon 까지 입력해야 한다. (gon이 입력되기 전까지는 go 인지 gone인지 확신할 수 없다.)
  • guild를 찾을 때는 gu 까지만 입력하면 guild가 완성된다.

이 경우 총 입력해야 할 문자의 수는 7이다.

라이언을 도와 위와 같이 문자열이 입력으로 주어지면 학습을 시킨 후, 학습된 단어들을 순서대로 찾을 때 몇 개의 문자를 입력하면 되는지 계산하는 프로그램을 만들어보자.

입력 형식

학습과 검색에 사용될 중복 없는 단어 N개가 주어진다.
모든 단어는 알파벳 소문자로 구성되며 단어의 수 N과 단어들의 길이의 총합 L의 범위는 다음과 같다.

  • 2 <= N <= 100,000
  • 2 <= L <= 1,000,000

출력 형식

단어를 찾을 때 입력해야 할 총 문자수를 리턴한다.

입출력 예제

wordsresult
["go","gone","guild"] 7
["abc","def","ghi","jklm"] 4
["word","war","warrior","world"] 15

입출력 설명

  • 첫 번째 예제는 본문 설명과 같다.
  • 두 번째 예제에서는 모든 단어들이 공통된 부분이 없으므로, 가장 앞글자만 입력하면 된다.
  • 세 번째 예제는 총 15 자를 입력해야 하고 설명은 아래와 같다.
    • word는 word모두 입력해야 한다.
    • war는 war 까지 모두 입력해야 한다.
    • warrior는 warr 까지만 입력하면 된다.
    • world는 worl까지 입력해야 한다. (word와 구분되어야 함을 명심하자)

 

<풀이법>

▒ 한줄 개념: 트라이 알고리즘 ▒ 

오랜만에 푸는 코테 문제인데, 트라이 알고리즘을 이용해서 푸는 문제이다.

트라이 알고리즘은 예전에 사용해본 경험이 있어 접근은 어렵지 않았으나, 자바로 구현하는 부분에서 어려움을 느꼈다.

woovictory.github.io/2020/04/22/Java-Trie/

 

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

Trie 자료구조란? 일반 트리 자료구조 중 하나로, Digital Tree, Radix Tree, Prefix Tree라고도 불린다. 텍스트 자동 완성 기능과 같이 문자열을 저장하고 탐색하는데 유용한 자료구조이다.

woovictory.github.io

위의 글을 참고하면 트라이 알고리즘을 쉽게 이해할 수 있다.

 

<코드(Java)>

import java.util.HashMap;

class Solution {
    static Node root = new Node();

    static int solution(String[] words) {
        int answer = 0;

        for(String word: words){
            insert(word);
        }

        return search(root, 0);
    }

    static void insert(String word){
        Node curNode = root;
        for(int i = 0; i < word.length(); i++){
            Node newRoot = curNode.put(word.charAt(i));
            curNode = newRoot;
        }
        curNode.put('*');
    }

    static int search(Node root, int cnt){
        if(root.childCount == 1){
            return cnt;
        }
        int count = 0;
        for(char key: root.childNodes.keySet()){
            if(key == '*'){
                count += cnt;
            }
            else{
                count += search(root.childNodes.get(key), cnt+1);
            }
        }
        return count;
    }

    static class Node{
        private HashMap<Character, Node> childNodes = new HashMap<>();
        private int childCount = 0;

        Node put(char c){
            childCount++;
            if(!childNodes.containsKey(c)) {
                childNodes.put(c, new Node());
            }
            return childNodes.get(c);
        }
    }
}

 

 

더 많은 코드 보기(GitHub) : github.com/dwkim-97/CodingTest

 

 

반응형
저작자표시 (새창열림)

'Programmers' 카테고리의 다른 글

[프로그래머스] 호텔 방 배정 / Java  (0) 2021.03.13
[프로그래머스] 카카오프렌즈 컬러링북 / Java  (0) 2021.03.12
[프로그래머스] 기둥과 보 설치 / Python  (0) 2021.02.16
[프로그래머스] 숫자 블록 / Python  (0) 2021.02.16
[프로그래머스] 3 x n 타일링 / Python  (1) 2021.02.16
    'Programmers' 카테고리의 다른 글
    • [프로그래머스] 호텔 방 배정 / Java
    • [프로그래머스] 카카오프렌즈 컬러링북 / Java
    • [프로그래머스] 기둥과 보 설치 / Python
    • [프로그래머스] 숫자 블록 / Python
    개발하는 사막여우
    개발하는 사막여우
    개발개발 주저리주저리

    티스토리툴바