https://school.programmers.co.kr/learn/courses/30/lessons/42577
문제
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
- 구조대 : 119
- 박준영 : 97 674 223
- 지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 ture 를 return 하도록 solution 함수 작성해주세요.
제한사항
- phone_book의 길이는 1 이상 1,000,000 이하입니다.
- 각 전화번호의 길이는 1 이상 20 이하입니다.
- 같은 전화번호가 중복해서 들어있지 않습니다.
🤔 어떻게 접근해볼까?
- 일단 '접두어'끼리 비교를 해야하기 때문에 '접두어가' '비슷'한 애들끼리 뭉쳐있으면 좋겠다 싶어, sort 로 정렬을 해주어야겠다고 생각하였다.
- 번호 자체가 다른 번호의 접두어가 되기 위해서는 슬라이싱의 개념을 생각해보았다.
- 그 숫자가 클래스 내의 아무 숫자에나 포함만 되면 되니까!
💡 헷갈리면 그냥 외우자!
접두사 비교: 인접한 두 요소를 비교하기 위해서는 마지막 요소를 포함하지 않는 범위로 반복.
😵 파이썬 슬라이싱이란?
- start: 시작 인덱스 (이 인덱스부터 포함)
- end: 종료 인덱스 (이 인덱스는 포함하지 않음)
text = "hello" 라는 변수가 있다고 해보자.
print(text[0:2]) # "he" (인덱스 0부터 1까지 포함)
print(text[1:4]) # "ell" (인덱스 1부터 3까지 포함)
print(text[:2]) # "he" (처음부터 인덱스 1까지 포함)
print(text[2:]) # "llo" (인덱스 2부터 끝까지 포함)
첫번째시도
# 실패한 코드
def solution(phone_book):
phone_book.sort()
for i in range(len(phone_book)):
if phone_book[i] == phone_book[i + 1][:len(phone_book[i])]:
return False
return True
오류가 떴다.. 일단 나는 접두어끼리 반복하기 위해서 .. 첫번째 있는 애가.. 다음의 숫자에 포함이 되는지에 대한 코드를 짰는데
아주 바보같은 실수를 했다.
두번째시도
def solution(phone_book):
phone_book.sort()
for i in range(len(phone_book) - 1): # 올바른 범위 설정
if phone_book[i] == phone_book[i + 1][:len(phone_book[i])]:
return False
return True
만약에 -1 을 해주지 않으면 마지막에 있는 숫자도 검사를 하려고 하기 때문에 인덱스 오류가 날 수 있다.
다른사람 코드
프로그래머스에 있는 다른 분의 코드를 보다가 난생 첨 보는 메서드가 있어서 공부할 겸 블로그에 포스팅한다...
def solution(phoneBook):
phoneBook = sorted(phoneBook)
for p1, p2 in zip(phoneBook, phoneBook[1:]):
if p2.startswith(p1):
return False
return True
😱 startswith 가 뭐지?
startswith
startswith 는 문자열 함수 중 하나로, 현재 문자열이 사용자가 지정하는 특정 문자로 시작하는지 확인하는 함수이다. 리턴 값은 true 혹은 false
str = 'hihilong'
result = str.startswith('hi')
print(result)
>> True
endswith
endswith 는 문자열 함수 중 하나로, 현재 문자열이 사용자가 지정하는 특정 문자로 끝나는지 확인하는 함수입이다. 리턴 값은 true 혹은 false
str = 'hihilong'
result = str.endswith('long')
print(result)
>>True
그러니까 위에 코드는 맨처음 정렬을 해주고, 맨 처음 시작의 값과 다음부터 나머지 값들을 ( ***내가 반복문으로 범위지정에 어려움을 여겼던 부분이라 더욱 획기적으로 여겨졌다 ㅠㅠ) zip 으로 묶어주고, p2 에 있는 단어들의 접두어가 p1 으로 시작한다면, False 를 반환하는 코드이다. 훨씬 직관적이고 훨씬 이해가 쉬워졌다.
역시...열심히해야한다. ㅠ ㅁ ㅠ
'Algorithm' 카테고리의 다른 글
[Python] 프로그래머스 해시-베스트 앨범 (0) | 2024.07.13 |
---|---|
[Python] 프로그래머스 해시 - 의상 (1) | 2024.07.12 |
[Python] 프로그래머스 알고리즘 해시- 완주하지 못한 선수 (0) | 2024.07.10 |
[Python] 프로그래머스 알고리즘 해시 - 폰켓몬 (0) | 2024.07.09 |
백준 문제풀이- 1157 단어공부 (0) | 2024.03.14 |