반응형
문제
전화번호 목록이 주어진다. 이때, 이 목록이 일관성이 있는지 없는지를 구하는 프로그램을 작성하시오.
전화번호 목록이 일관성을 유지하려면, 한 번호가 다른 번호의 접두어인 경우가 없어야 한다.
예를 들어, 전화번호 목록이 아래와 같은 경우를 생각해보자
- 긴급전화: 911
- 상근: 97 625 999
- 선영: 91 12 54 26
이 경우에 선영이에게 전화를 걸 수 있는 방법이 없다. 전화기를 들고 선영이 번호의 처음 세 자리를 누르는 순간 바로 긴급전화가 걸리기 때문이다. 따라서, 이 목록은 일관성이 없는 목록이다.
입력
첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가 하나씩 주어진다. 전화번호의 길이는 길어야 10자리이며, 목록에 있는 두 전화번호가 같은 경우는 없다.
출력
각 테스트 케이스에 대해서, 일관성 있는 목록인 경우에는 YES, 아닌 경우에는 NO를 출력한다.
핵심 아이디어 string으로 입력받아서 정렬하기
접두어 비교를 위해 첫 인덱스부터 비교가 들어가야 하는데 한 문자열 기준 다른 모든 문자열 비교에
n^2 이 수행됨.
정렬을 먼저 수행(퀵소트) nlogn으로 해결되고, string 정렬되었으므로 i번째 인덱스 string과 i+1번째 스트링만 비교하면 됨.
abc abcdef 이렇게 정렬될 것이고,
abcdef abd 이렇게 정렬되더라도 c와 d에서 일치 하지 않으므로 끝남.
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<string.h>
using namespace std;
int main(void)
{
int T;
cin >> T;
while (T--)
{
int N;
cin >> N;
vector<string> vec;
for (int i = 0; i < N; i++)
{
string str;
cin >> str;
vec.push_back(str);
}
sort(vec.begin(), vec.end());
int size = vec.size();
bool check = true;
for (int i = 0; i < size - 1; i++)
{
int length = vec[i].size();
bool flag = true;
for (int j = 0; j < length; j++)
{
if (vec[i][j] != vec[i + 1][j])
{
flag = false;
break;
}
}
if (flag)
{
check = false;
break;
}
}
if (!check)
{
cout << "NO" << endl;
}
else
{
cout << "YES" << endl;
}
}
}
반응형
'Algorithm' 카테고리의 다른 글
백준 16922번 로마숫자 만들기 (0) | 2020.07.15 |
---|---|
백준 2234번 성곽 (0) | 2020.07.15 |
백준 2151번 거울 설치 (0) | 2020.07.14 |
백준 4991번 로봇 청소기 (0) | 2020.07.13 |
백준 2422번 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 (0) | 2020.07.12 |