Skip to content

Commit

Permalink
add 2024_07_26 TIL
Browse files Browse the repository at this point in the history
  • Loading branch information
terri1102 authored Jul 26, 2024
1 parent 7b5c2d9 commit 9f6665b
Showing 1 changed file with 102 additions and 0 deletions.
102 changes: 102 additions & 0 deletions StudyGroups/TIL/2024/JULY/2024_07_26.md
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']

0 comments on commit 9f6665b

Please sign in to comment.