나는 먼저, 정렬을 한 뒤에 인접 번호에 겹치는 접두사가 있는지
확인하는 방식으로 문제를 풀었다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool solution(vector<string> phone_book) {
bool answer = true;
sort(phone_book.begin(), phone_book.end());
for (int i = 1; i < phone_book.size(); i++) {
if (phone_book[i - 1][0] != phone_book[i][0]) continue;
if (phone_book[i].find(phone_book[i - 1]) != string::npos) {
// find method를 사용해서, npos가 아니면 접두사가 존재.
answer = false;
break;
}
}
return answer;
}
다른 풀이 - Hash map
문제를 푼 뒤 인터넷을 찾아보니, 다른 풀이가 있었다.
흔히 Hash map으로 사용하는 Unorderd map을 이용한 풀이였다.
Unordered map은 일반적인 Map, Set과 다르게 정렬이 되지 않는다.
그래서 다음과 같은 시간 복잡도를 가진다.
- Map, Set : O(log N)
- Unordered Map : O(1)
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
bool solution(vector<string> phone_book) {
unordered_map<string, int> hash_map; // Hash map 선언
for (int i = 0; i < phone_book.size(); i++)
hash_map[phone_book[i]] = 1;
// 전화번호들을 모두 Hash map에 저장.
for (int i = 0; i < phone_book.size(); i++) {
for (int j = 0; j < phone_book[i].size()-1; j++) {
string number = phone_book[i].substr(0, j + 1);
// 전화번호부의 Substring 들과 Hash map을 비교한다.
// Hash map에 존재하면, 접두사가 겹치는 것이므로 False.
if (hash_map[number]) return false;
}
}
return true;
}