Koder / 박성훈
article thumbnail

알고리즘 재활 2일차.

https://www.acmicpc.net/problem/5052

 

5052번: 전화번호 목록

첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가

www.acmicpc.net

랜덤으로 집어온 문제.

trie 자료구조를 통해 해결할 수 있다.

전에 아호코라식 기초문제 풀면서 분명 다뤘던거같은데

까먹어서 다시 배웠다

https://rebro.kr/86

 

[자료구조] 트라이(Trie) 자료구조

[목차] 1. 트라이(Trie) 자료구조란? 2. 트라이(Trie)의 작동 원리 3. 트라이(Trie) 자료구조의 장/단점 4. 트라이(Trie) 자료구조의 구현 5. 트라이(Trie) 예제 문제 1. 트라이(Trie) 자료구조란? 트라이(Trie)는

rebro.kr

 

각 자릿수를 트리의 노드로 봐서

입력된 문자열을 트리로 펼쳐낸다?

나는 trie 자료구조를 보고 이런 감상을 받았다.

 

트라이 기초 구현이라서 g4 받은거 같고

처음엔 살짝 낮나 싶었는데

substr 활용해서 풀수도 있다고 한다.

 

더보기
#include <bits/stdc++.h>
using namespace std;

bool cmp(string &s1, string &s2){
	if(s1.length() != s2.length()) return s1.length() > s2.length();
	return s1 > s2;
}

struct trie{
	trie* child[11] = {nullptr,};
	
	bool insert(string &str, int idx){
		int nxt = str[idx]-'0';
		
		if(str.length() == idx){
			for(int i=0; i<11; i++){
				if(child[i] != nullptr){
					return false;
				}
			}
			return true;
		}
		else{
			if(child[nxt] == nullptr) child[nxt] = new trie;
			return child[nxt] -> insert(str, idx+1);
		}
	}
};

int main(){	
	int t,n;
	string tmp;
	vector<string> v;
	
	cin >> t;
	while(t--){
		trie g;
		
		v.clear();
		cin >> n;
		for(int i=0; i<n; i++){
			cin >> tmp;
			v.push_back(tmp);
		}
		
		sort(v.begin(), v.end(), cmp);
		
		for(int i=0; i<n; i++){
			bool chk = g.insert(v[i], 0);
			if(chk == false){ cout << "NO\n"; goto flag; }
		}
		cout << "YES\n";
		flag:; 
	}
	return 0;
}

보통 trie면

insert와 find 두개로 함수를 분리하는데

앞부분이 같은지만 확인하면 될것 같아서

문자열의 길이가 긴 순으로 정렬한 다음에

insert함수에서 바로바로 확인해줬다.

 

 

+

@bamgoesn 님과의 대화

풀이 방법에 대한 이야기를 하면서,

모든 문자열을 사전순으로 정렬하게 되면 접두사냐 아니냐의 관계는 그 안에서 반드시 인접한 위치에 있게 되므로, 정렬 후 모든 인접한 문자열을 뒤져보면서 앞의 것이 뒤의 것의 접두사인지 체크하는 식으로 풀거나 하면 되는거같아요.

요런풀이도 있다고 해주셨는데

>>정렬<< 여기서 써먹는거 진짜 대단하다고 생각한다.

세상엔 너무 머리좋은사람이많아요

엉엉

반응형