Developer with Cat
© 2021. All rights reserved.
#[프로그래머스✈][2020 kakao] 가사 검색 문제 풀이
너 TRIE 자료구조 아냐?
자세한 문제 설명과 제한 사항은 프로그래머스 홈페이지 참고. 문제풀러가기
트리가 아니다 T.R.I.E. 다. TRIE 자료구조는 단어의 각 글자를 Node 로 보고 자료를 저장하는 자료구조입니다. 자세한건 🛴 보러가기
Trie를 쓰기만 해서 풀 수 있는게 아니다.?가 등장하면 자료를 검색할 수 없다. 따라서 글자의 길이 마다, 그리고 각 노드에 이 노드를 지나간 놈이 몇명이냐를 저장해서 들어오는 인풋을 양쪽으로 검색할 필요가 있는 아주 미친듯한 문제다.
프로그래머스 사이트에서 풀고 직접 가져온 코드 입니다.
#include <string> #include <vector> #include <algorithm> using namespace std; struct Trie { int data; Trie *node[26]; }; bool makeTree(string& word, Trie &node, int idx, bool mode); //if exist then true, else false int findWord(string& word, Trie &node, int idx); Trie head[10020]; Trie tail[10020]; vector<int> solution(vector<string> words, vector<string> queries) { vector<int> answer; for (size_t i = 0; i < words.size(); i++) { int length = words[i].size(); if (!makeTree(words[i], head[length], 0, true)) { head[length].data++; } } for (size_t i = 0; i < words.size(); i++) { int length = words[i].length(); if (!makeTree(words[i], tail[length], length - 1, false)) { tail[length].data++; } } for (size_t i = 0; i < queries.size(); i++) { int length = queries[i].size(); int count = 0; while (queries[i][count] == '?') count++; if (count == length) { answer.push_back(head[count].data); } else if (queries[i][0] == '?') { reverse(queries[i].begin(), queries[i].end()); answer.push_back(findWord(queries[i], tail[length], 0)); } else { answer.push_back(findWord(queries[i], head[length], 0)); } } return answer; } bool makeTree(string& word, Trie& node, int idx, bool mode){ //node[alphabet] = 자식 if (mode && word.length() <= idx) return false; if (!mode && idx < 0) return false; if (node.node[word[idx] - 'a'] == NULL) { node.node[word[idx] - 'a'] = new Trie(); } else if (mode && idx == word.length() - 1 && node.node[word[idx] - 'a'] != NULL) { return true; } else if (!mode && idx == 0 && node.node[word[idx] - 'a'] != NULL) { return true; } if (mode == true) { if (!makeTree(word, *node.node[word[idx] - 'a'], idx + 1, mode)) { node.node[word[idx] - 'a']->data++; return false; } else { return true; } } else { if (!makeTree(word, *node.node[word[idx] - 'a'], idx - 1, mode)) { node.node[word[idx] - 'a']->data++; return false; } else { return true; } } return false; } int findWord(string& word, Trie& node, int idx) { if (&node == NULL) { return 0; } if (node.node[word[idx] - 'a'] == NULL && idx == word.length() - 1) { return node.data; } else if (node.node[word[idx] - 'a'] == NULL && idx != word.length() - 1) { return 0; } if (word.length() == idx - 1) { return node.node[word[idx] - 'a']->data; } if (word[idx + 1] == '?') { return node.node[word[idx] - 'a']->data; } return findWord(word, *node.node[word[idx] - 'a'], idx + 1); }
제 소스코드 보다 더 잘 만든 사람 많으니 찾아보시는 거 추천합니다. 저도 어려운건 잘 못해요. (●’◡’●)
이 정도 난이도의 문제를 시간내에 풀 수 있다면 당신은 최고의 실력자! 한 번 풀어보고 다시 풀어보자!