카테고리 없음

[2018 KAKAO BLIND RECRUITMENT][Trie] 자동완성 - Java

1Fe 2020. 12. 4. 18:58

문제 바로가기

 

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

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

programmers.co.kr

 

트라이를 활용하는 문제입니다!!

혼자서 짤 수 있을 것 같았는데 고새 까먹었네여 ㅜ

import java.util.*;

class Solution {
    static class TrieNode {
		Map<Character, TrieNode> child = new HashMap<>();
		int cnt = 0;
	}

	static class Trie {
		TrieNode root;

		Trie() {
			this.root = new TrieNode();
		}

		void insert(String word) {
			TrieNode cur = this.root;

			for (int i = 0; i < word.length(); i++) {
				char c = word.charAt(i);
				if (cur.child.get(c) == null) {
					cur.child.put(c, new TrieNode());
				}
				cur = cur.child.get(c);
				cur.cnt++;
			}
		}

		int getLength(String word) {
			TrieNode cur = this.root;
			int length = 0;
			
			for(int i = 0; i < word.length(); i++) {
				cur = cur.child.get(word.charAt(i));
				length++;
				
				if(cur.cnt == 1) break;
			}

			return length;
		}
	}

	public int solution(String[] words) {
		int answer = 0;
		Trie trie = new Trie();

		for (String s : words) {
			trie.insert(s);
		}

		for (String s : words) {
			answer += trie.getLength(s);
		}

		return answer;
	}
}

트라이를 구현하기 위해 TrieNode 클래스와 Trie 클래스를 선언했습니다. 먼저 TrieNode 부터 보시져.

static class TrieNode {
	// 자식 노드
	Map<Character, TrieNode> child = new HashMap<>();
	// 해당 노드의 카운트
	int cnt = 0;
}

Map으로 자식 노드들을 저장했고, cnt 로 해당 노드의 카운트입니다. 예를 들어 word, world로 트라이를 만들었을 때 w(2), o(2), r(2), d(1), l(1), d(1) 이런 식으루요. 이렇게 하면 cnt가 1인 친구를 만나면 거기서는 그 단어를 확신할 수 있게 됩니다.

 

요렇게만 구해놓으면 정답은 쉽게 구할 수 있습니다. 위에서 말했듯 cnt가 1일때까지 내려가보면 되는 것이지용.

 

 

트라이 구현하는 연습!!!

감사합니다!!!