전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
phone_book의 길이는 1 이상 1,000,000 이하입니다.
각 전화번호의 길이는 1 이상 20 이하입니다.
입출력 예 #1
앞에서 설명한 예와 같습니다.
입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.
입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool solution(vector<string> phone_book) {
bool answer = true;
int i;
sort(phone_book.begin(), phone_book.end());
for(i=0;i<phone_book.size()-1;i++){
if(phone_book[i] == phone_book[i+1].substr(0, phone_book[i].size())) {
answer = false;
break;
}
}
return answer;
}
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
bool solution(vector<string> phone_book){
// HashMap 생성
unordered_map<string, int> map;
for (int i = 0; i < phone_book.size(); i++){
// key가 phone_number이 되도록하고, value를 1로 설정
map[phone_book[i]] = 1;
}
// 모든 전화번호의 substring이 HashMap에 존재하는지 확인
for (int i = 0; i < phone_book.size(); i++){
for (int j = 0; j < phone_book[i].size() - 1; j++){
string phone_number = phone_book[i].substr(0, j + 1);
if (map[phone_number]==1)
return false;
}
}
// 접두어가 없는 경우 true 출력
return true;
}
해싱된 맵이다. 맵은 key와 value 두 쌍으로 데이터를 보관하는 자료구조이다. key를 통한 value로의 접근이 빠르다. hash는 어떤 데이터를 특정 연산으로 특별한 값으로 변환하는 개념이다.
LV1을 풀면서 어느 정도 감이 온 건지 해당 숫자들을 사전식으로 정렬하면 그 부분의 바로 뒷 부분이랑만 비교하면 돼서 더 효율적일 것으로 생각했다.
직관적으로 하나하나 비교하고자 하는 것 말고, 다른 것을 사용해서 풀이하는 방법도 있을 것 같았다.
찾아보니 해시맵이라는게 있었다.
map, hash 등에 대해 잘 몰랐기 때문에 여러 부분 찾아보고 그랬다.
(map[key] → value) : key를 주면 key에 해당하는 value 값을 반환한다.