[백준 5052번] 전화번호 목록

2023. 10. 5. 12:12·알고리즘 문제풀이/백준
반응형

문제 링크: https://www.acmicpc.net/problem/5052

 

5052번: 전화번호 목록

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

www.acmicpc.net

<문제 풀이> 트라이(trie)

 

트라이를 사용하여 전화번호를 삽입합니다. 삽입할 때마다, 트라이 내에 전화번호의 접두사가 이미 존재하는지 확인해야 합니다.

이를 구현하기 위해서는 find 함수에서 각 노드의 자식 노드의 존재 여부와 전화번호의 끝을 체크해야 합니다.

 

 

<C++소스코드>

 
#include<iostream>
#include<cstring>
using namespace std;

class Trie {
public:
	static const int MX = 10000 * 10;
	static const int ROOT = 1;
	int unused = 2;
	int nxt[MX + 1][10];
	bool check[MX + 1];

	Trie() {
		memset(nxt, 0xff, sizeof(nxt));
		memset(check, 0x00, sizeof(check));
	}
	void insert(const string &s) {
		int cur = ROOT;
		for (auto& c : s) {
			if (nxt[cur][c - '0'] == -1) nxt[cur][c - '0'] = unused++;
			cur = nxt[cur][c - '0'];
		}
		check[cur] = true;
	}
	bool find(const string& s) {
		int cur = ROOT;
		for (auto& c : s) {
			cur = nxt[cur][c - '0'];
			if (cur == -1) return false;
			else if (check[cur]) return true;
		}
		return true;
	}
};

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	int test_case; cin >> test_case;
	while (test_case--) {
		int n; cin >> n;
		string ans = "YES";
		Trie *trie = new Trie();
		for (int i = 0; i < n; i ++) {
			string num; cin >> num;
			if (trie->find(num)) ans = "NO";
			trie->insert(num);
		}
		cout << ans << '\n';
	}

	return 0;
}
반응형
저작자표시 (새창열림)

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 1719번] 택배  (1) 2023.10.16
[백준 14426번] 접두사 찾기  (1) 2023.10.04
[백준 10217번] KCM Travel  (1) 2023.10.04
[백준 1948번] 임계경로  (1) 2023.10.04
[백준 24042번] 횡단보도  (1) 2023.10.04
'알고리즘 문제풀이/백준' 카테고리의 다른 글
  • [백준 1719번] 택배
  • [백준 14426번] 접두사 찾기
  • [백준 10217번] KCM Travel
  • [백준 1948번] 임계경로
슥지니
슥지니
개발 블로그
  • 슥지니
    슥지니의 코딩노트
    슥지니
  • 전체
    오늘
    어제
    • 분류 전체보기 (198)
      • 알고리즘 문제풀이 (158)
        • 백준 (158)
      • 알고리즘 (6)
      • Node.js (2)
        • MongoDB (1)
        • 기타 (1)
      • spring (0)
      • 가상화폐 (1)
        • 바이낸스(Binance) (1)
      • C++ 테트리스 게임 (0)
      • C++ (10)
      • 안드로이드 프로그래밍 (21)
        • 코틀린 (21)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    구현
    콘솔
    다이나믹 프로그래밍
    그래프
    C++
    BFS
    dp
    자료구조
    우선순위 큐
    dfs
    알고리즘
    시뮬레이션
    콘솔 테트리스 게임
    백트랙킹
    그리디
    C
    코틀린을 활용한 안드로이드 프로그래밍
    Kotlin
    백준
    코틀린
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
슥지니
[백준 5052번] 전화번호 목록
상단으로

티스토리툴바