-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
102 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
|
||
## 문제 1 전화번호 목록 | ||
|
||
https://school.programmers.co.kr/learn/courses/30/lessons/42577# | ||
|
||
## 아이디어 1 Bruteforce | ||
- 2중 for 문을 돌면서 확인한다. | ||
- 가장 먼저 떠올린 2중 for문으로 푸는 법으로 시간 제한에 걸릴 것 같았지만, 일단 구현해봤다. | ||
- 시간 복잡도: O(N^2) | ||
- 공간 복잡도: O(1) | ||
- 결과 | ||
- 정확도 테스트: 17/20 | ||
- 효율성 테스트: 2/4 | ||
|
||
## 풀이 1 | ||
```python | ||
def solution(phone_book): | ||
if len(phone_book) <= 1: | ||
return True | ||
|
||
for i in range(len(phone_book)): | ||
for j in range(i+1, len(phone_book)): | ||
len_i = len(phone_book[i]) | ||
len_j = len(phone_book[j]) | ||
|
||
if len_i <= len_j: | ||
if phone_book[j][:len_i] == phone_book[i]: | ||
return False | ||
return True | ||
``` | ||
|
||
## 아이디어 2 : combination | ||
- phone_book에서 2개 뽑아서 prefix인지 비교하는 방법 | ||
- 시간 복잡도: O(N^2) | ||
- 공간 복잡도: O(1) | ||
|
||
- 결과 | ||
- 정확도 테스트: 20/20 | ||
- 효율성 테스트 2/4 | ||
|
||
```python | ||
def solution(phone_book): | ||
from itertools import combinations | ||
if len(phone_book) <= 1: | ||
return True | ||
for i, j in combinations(phone_book,2): | ||
if j.startswith(i) | i.startswith(j): | ||
answer = False | ||
break | ||
else: | ||
answer = True | ||
return answer | ||
``` | ||
|
||
## 아이디어 3 | ||
- 전화번호 길이에 따라 정렬 후 짧은 것부터 set에 넣고 뒤에 단어의 앞 부분만 검사함 | ||
- 여기서 아쉬운 점이 전화번호의 길이로 정렬을 한 것이다... | ||
- 아이디어 4처럼 사전 순 정렬을 했으면 앞뒤 번호만 비교했어도 될 것이다. | ||
- 시간 복잡도: O(N^2) | ||
- 공간 복잡도: O(N) | ||
- 결과 | ||
- 정확도 테스트: 20/20 | ||
- 효율성 테스트 2/4 | ||
```python | ||
def solution(phone_book): | ||
phone_book = sorted(phone_book, key=lambda x: len(x)) | ||
hash_dict = set() | ||
for i in range(len(phone_book)-1): | ||
len_num = len(phone_book[i]) | ||
if phone_book[i] not in hash_dict: | ||
hash_dict.add(phone_book[i]) | ||
for j in range(i+1, len(phone_book)): | ||
curr_num_prefix = phone_book[j][:len_num] | ||
if curr_num_prefix in hash_dict: | ||
return False | ||
return True | ||
``` | ||
## 아이디어 4 | ||
- 1. 숫자 오름차순으로 정렬(dictionary order에 따라서 정렬이 되기 때문에, prefix는 뒤의 요소와 비교하면 됨) | ||
- 2. 1번 순회하며 앞뒤 비교 | ||
- ex) ["11", "111", "1234", "55", "789", "1000"] 정렬 | ||
-> ['1000', '11', '111', '1234', '55', '789'] | ||
- 결국 아이디어 3까지 풀고 효율성 테스트를 못 통과해서 ChatGPT 결과를 사용했다. | ||
- 결과 | ||
- 정확도 테스트: 20/20 | ||
- 효율성 테스트 4/4 | ||
```python | ||
def solution(phone_book): | ||
phone_book.sort() | ||
|
||
for i in range(len(phone_book) - 1): | ||
if phone_book[i + 1].startswith(phone_book[i]): | ||
return False | ||
|
||
return True | ||
``` | ||
|
||
## 배운 점 | ||
- prefix를 빠르게 구하기 위해 정렬을 할 때 전화 번호 "길이"가 아니라 "사전 순서"에 따라 정렬을 해야 빠른 비교가 가능하다. | ||
- 숫자 스트링을 정렬하면 앞에서 부터 숫자 하나씩 비교하며 오름차순 정렬을 하기 때문에 숫자 비교와 결과가 다르다. | ||
- ex) ["11", "111", "1234", "55", "789", "1000"] 정렬 | ||
-> ['1000', '11', '111', '1234', '55', '789'] |