문제 설명
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
- 구조대 : 119
- 박준영 : 97 674 223
- 지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
제한 사항
- phone_book의 길이는 1 이상 1,000,000 이하입니다.
- 각 전화번호의 길이는 1이상 20 이하입니다.
- 같은 전화번호가 중복해서 들어있지 않습니다.
입출력 예제
phone_book | return |
["119", "97674223", "1195524421"] | false |
["123","456","789"] | true |
["12","123","1235","567","88"] | false |
입출력 예 설명
입출력 예 #1 앞에서 설명한 예와 같습니다.
입출력 예 #2 한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.
입출력 예 #3 첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.
이것도 해쉬문제인데 해쉬로 풀어보려고 했다가 못풀었다..
푸는 방법은 3가지 정도로 추릴 수 있음
1. loop
2. sorting+loop
3. hash
1. 나의 답
def solution(phone_book):
for i in range(len(phone_book)) :
for j in range(i+1, len(phone_book)) :
if phone_book[i].startswith(phone_book[j]) :
return False
if phone_book[j].startswith(phone_book[i]) :
return False
return True
답은 나오지만 for문을 두개나 쓴 효율은 개나준 코드이다
그냥 모든 경우의 수를 비교한다
2. sorting+loop
def solution(phone_book):
phone_book.sort()
for p1,p2 in list(zip(phone_book,phone_book[1:])):
if p2.startswith(p1) :
return False
return True
이게 딱 깔끔하고 좋은 것 같다
이미 정렬을 하고 for문을 돌렸기 때문에 앞에는 겹칠 일이 없다
그러니까 p2가 p1으로 시작하는지 한번만 확인하면 된다
sort만 잘해도 웬만하면 다 되는 것 같다..
zip을 자유자재로 쓸 수 있는 능력이 생겼으면 좋겠다
3. hash
def solution(phone_book):
hash_map = {}
for v in phone_book:
hash_map[v] = 1
for check in phone_book :
pre = ''
for c in check :
pre = pre+c
if pre in hash_map and pre!=check :
return False
return True
해쉬맵을 만들어주고 value를 다 1로 설정해준다
여기서 1은 개수의 1이 아니라 해당 번호의 유무를 나타낸다
그 후 전화번호부를 하나씩 돌며 체크한다
for문을 한번더 써서 c의 요소를 하나씩 더해가며 접두사(prefix)가 있는지 in으로 확인한다
여기서 and으로 접두사가 전화번호랑 완전히 같지 않아야하는 조건을 추가해준다
(제한사항에 완전히 같은 전화번호는 없기때문에 완전히 같기 전까지만 같은게 있는지 확인하기 위함)
접두어가 있으면 False를 리턴하고
아니면 True를 리턴
개발자로 취업하기님의 유투브영상을 참고하였다
'코딩테스트 > python' 카테고리의 다른 글
[프로그래머스 고득점 kit] 스택/큐 - 같은 숫자는 싫어 (0) | 2023.09.02 |
---|---|
[프로그래머스 고득점 kit] 해시 - 베스트앨범 (0) | 2023.08.31 |
[프로그래머스 고득점 kit] 해시 - 완주하지 못한 선수 (0) | 2023.08.29 |
프로그래머스 lv1 없는 숫자 더하기 (0) | 2023.08.25 |
프로그래머스 lv1 음양더하기 (0) | 2023.08.25 |