Search
Duplicate
📗

[프로그래머스] 완주하지 못한 선수

주차
0주차
문제번호
0000
언어
티어
실버
유형
문자열
해시
nj_Blog
nj_상태
이해도
풀이
사람
이해도 2
13 more properties
사용 자료구조 : Trie
풀이 방법
마라톤에 참여한 선수들의 이름과, 완주에 성공한 사람들의 이름들이 주어집니다. 처음에 트라이에 마라톤에 참여한 선수들의 이름을 넣으려 했는데 이러면 완주에 성공하지 못한 선수의 이름을 찾기 위해 순회를 한번 더 해야한다는 생각이 들어서 완주에 성공한 사람들의 이름들을 통해 트라이를 구성하고 참여한 사람들의 이름을 하나씩 대입하여 찾는 방식으로 진행했습니다.
완벽히 코드를 작성했다고 생각했지만 계속 틀려서 시간이 좀 걸렸는데, 그 이유는 동명이인이 3명이 생길 수 있다는 사실을 간과했기 때문입니다. 따라서 trie를 구성할때 terminal을 bool 형이 아닌 int 형으로 두어서 동명이인을 카운트 하는 방식으로 진행했습니다.
코드
#include <iostream> #include <vector> int to_number(char ch) { return (ch - 'a'); } struct Trie { std::vector<Trie *>children; int terminal; Trie(): terminal(false) { children.resize(26, nullptr); } ~Trie() { for (size_t i = 0 ; i < 26 ; i++) if (children[i]) delete children[i]; } void insert(std::string &key, int i) { if (key[i] == '\0') terminal++; else { int next = to_number(key[i]); if (children[next] == nullptr) children[next] = new Trie(); children[next] -> insert(key, i+1); } } Trie* find(std::string &key, int i) { if (key[i] == '\0') { if (!terminal) return (nullptr); terminal--; return (this); } int next = to_number(key[i]); if (children[next] == nullptr) return (nullptr); return (children[next]->find(key, i+1)); } }; std::string solution(std::vector<std::string> participant, std::vector<std::string> completion) { Trie *p = new Trie(); std::string answer = ""; for (size_t i = 0 ; i < completion.size() ; i++) p->insert(completion[i], 0); for (size_t i = 0 ; i < participant.size(); i++) if (!p->find(participant[i], 0) && participant.size() != 1) { answer = participant[i]; break; } delete p; return (answer); }
C++
복사