문제 : 백준 5052 전화번호 목록 ☎️
난이도 : 골드 4
1️⃣ 전화번호의 길이는 최대 10자리이다.
2️⃣ 목록에 있는 두 전화번호가 같은 경우는 없다.
3️⃣ 전화번호 목록이 일관성을 유지하려면, 한 번호가 다른 번호의 접두어인 경우가 없어야 한다.
4️⃣ 일관성 있는 목록인 경우에는 YES, 아닌 경우에는 NO를 출력한다.
string phoneNumber;
vector<string> number;
for(int i=0; i<n; i++){
cin>>phoneNumber;
number.push_back(phoneNumber);
}
sort(number.begin(), number.end());
한 번호가 다른 번호의 접두어가 되려면, 다음의 조건을 만족해야 한다.
string ans = "YES";
for(int i = 0; i < n; i++){
for(int j=i+1; j<n; j++){
if(number[i].size() > number[j].size()) break;
if(number[i][0] != number[j][0]) break;
if(number[i] == number[j].substr(0, number[i].size())){
ans = "NO";
break;
} //한 번호가 다른 번호의 접두어인 경우
}
if(ans == "NO") break;
}
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int t = 0; //테스트 케이스 수
int n = 0; //전화번호 수
cin>>t;
while(t--){
cin>>n;
string phoneNumber;
vector<string> number;
for(int i=0; i<n; i++){
cin>>phoneNumber;
number.push_back(phoneNumber);
}
sort(number.begin(), number.end());
string ans = "YES";
for(int i = 0; i < n; i++){
for(int j=i+1; j<n; j++){
if(number[i].size() > number[j].size()) break;
if(number[i][0] != number[j][0]) break;
if(number[i] == number[j].substr(0, number[i].size())){
ans = "NO";
break;
}
}
if(ans == "NO") break;
}
cout<<ans<<"\n";
}
}