[BOJ] 5052: 전화번호 목록 Computer Science/ALGORITHM

Date 2021. 5. 12. 20:12

 

전화번호 n개에 대해 서로 접두사 관계인게 존재하는지 찾는 문제이다.

 

전화번호의 길이는 O(1)이고 완전탐색을 통해 찾으면 O(n^2)이 되기 떄문에 더 빠른 알고리즘을 찾아야 한다.

 

문제를 풀고 검색을 해보니 트라이라는 자료구조, 또 문자열 배열 전체를 정렬해서 인접 문자열끼리만 확인하는 간단한 방법이 있었다. 

 

나는 문제를 풀긴 풀었는데 뭔가 빙빙(?) 돌아갔다.

 

풀이

나는 일단 가능한 케이스를 모두 뒤져보는 완전탐색으로 풀었다.

 

1. 문자열을 길이별로 나눈 후 정렬한다. ( O(nlogn) 소요 )

ex ) LIST[2] 에는 길이 2인 문자열들을 정렬하여 저장

 

2.  1<=i<j<=10 인 순서쌍 (i,j) 에 대해 

LIST[i]에 있는 문자열들을 순회하며 LIST[i]의 원소가 LIST[j]의 원소 중 접두사가 가능한 게 있는지 찾는다.

 

이 때 LIST[i]의 크기는 N이므로 LIST[i]의 문자열 순회는 O(n) 이 소요되고,

LIST[j]는 정렬되어있는 상태이므로 LIST[i]의 원소를 LIST[j]에서 찾는것은 O(logn)이 소요된다. 

 

따라서 (i,j)에 대해 수행하는 연산은 총 O(nlogn)이 소요된다.

또한 가능한 순서쌍 (i,j)는 문자열의 길이가 제한되어있기 때문에 O(1)이기 때문에 ( 최대 가능한 경우의 수는 55이다. )

모든 원소를 순회하며 탐색하는데 O(nlogn)이 소요된다.

 

정렬에 O(nlogn), 탐색에 O(nlogn)이 소요되므로 총 O(nlogn)에 문제를 풀 수 있다.

 

 

이렇게 풀긴 풀었는데 뭔가 엄청 간단한 풀이들이 있고,

트라이 라는 자료구조도 알게 되었음. 끝 !

 

또 파이썬에서 input()으로 받으니 시간초과가 뜬다. 메모메모

 

 

 

'Computer Science > ALGORITHM' 카테고리의 다른 글

[BOJ] 1747: 소수&팰린드롬  (0) 2021.05.14
[BOJ] 2573: 빙산  (0) 2021.05.11
[BOJ] 5430번: AC  (0) 2021.05.10

Recent Posts

Popular posts

Recent Comments

Tag List

파이썬 TypeScript 컨테이너 인가 DNS 알고리즘 네트워크 클라우드 테라폼 리눅스 네임스페이스 인증 k8s API 백준 JavaScript GCP 도커 JWT ORM AWS DB IAC 운영체제
Total : Today : Yesterday :
Blog powered by Tistory, Designed by hanarotg