minzzl
[프로그래머스] - 해시.전화번호 목록 본문
네.. 어제 활활 불타오르던 의욕은 어디에 가고 ...
오늘 이렇게 해시 세번째 문제를 풀었습니다 ..
어제 완료하기로 했지만 뭐 ,,, ^^ 지금이라도 하는게 어디에요 ~
문제
풀이
근데 이 문제 좀 화납니다잉 ..
해시 대표 문제면 뭔가 해시를 쓸만한 타당성?을 줘야하는 문제여야하지 않나여 ?
왜 혼란을 주시는거져 ? ㅜ
(사실 내가 알고리즘 잘 못해서 화나는 고임)
쨋든
굳이 굳이 ... 각 번호들을 .. 해시 테이블에 넣고요 ...
그냥 문자열 비교합니다 ...
심지어 대표 코드 정답은 해시로 안 품요
나의 코드
def solution(phone_book):
answer = True
dictionary = {}
for phone_number in phone_book:
dictionary[phone_number] = 1
for phone_number in phone_book:
temp = ""
for number in phone_number:
temp += number
if temp in dictionary and temp != phone_number:
answer = False
return answer
다른 사람 코드
def solution(phoneBook):
phoneBook = sorted(phoneBook)
for p1, p2 in zip(phoneBook, phoneBook[1:]):
if p2.startswith(p1):
return False
return True
zip... 그게 뭔데 ...
길이가 같은 리스트 등의 요소를 묶어주는 함수
zip을 알기 전에, iterable이 무엇인지 알아야합니다.
파이썬에서 iterable 하다 라는 의미는 뜻 그대로 반복 가능한 것을 의미하며 반복 가능한 데이터 즉, 객체에 적용되는 의미입니다. 반복 가능한 데이터 타입은 순서형 및 컬렉션 자료형으로 다음 표로 요약됩니다.
- 순서형 및 컬렉션 데이터 타입 : string, list, tuple, range(), set, dict
기본/컬렉션 구분 |
소 구분 | 데이터 타입 | 데이터 타입 명 | 예 |
기본형 (basic data type) |
문자열 및 순서형 (text type, sequence type) |
string | str | 'sample_string' |
컬렉션형 (collection data type) |
순서형 (sequence type) |
list | list | [1, 4, 'name', 98.5] |
tuple | tuple | (1, 4, 'name', 98.5) | ||
range | range | range(1,9,2) | ||
집합형 (set type) |
set | set | {1, 4, 6, 9, 11} | |
맵핑형 (mapping type) |
dictionary | dict | {'이름': '홍길동', '나이': 43} |
"반복가능한" 데이터 타입은 한 시점에 해당 element 하나 하나를 개별로 리턴할 수 있으므로 for member in iteravle 데이터 타입으로 처리가능합니다.
zip 함수는 여러개의 iterable 자료형이 개수가 동일할 때 사용합니다.
# iterable자료형
>>> num = [1, 2, 3]
>>> fruit = ['apple', 'banana', 'orange']
>>> color = ['red', 'yellow', 'orange']
iterable 자료형의 각각의 요소를 나눈 후 순서대로 묶어서 요소 개수만큼 새로운 iterable 자료형을 생성합니다. 따라서 위와 같은 요소 개수가 같은 3개의 리스트가 있는 경우, 왼쪽부터 슬라이스 하듯 각 리스트에서 인덱스 위치 순서가 동일한 요소끼리 나눈 후 묶어줍니다.
# zip함수로 묶어줌
>>> zip_list = zip(num, fruit, color)
>>> print(zip_list, type(zip_list))
<zip object at 0x0000020180766048> <class 'zip'> #zip 타입으로 출력
>>> print(list(zip_list)) # list 타입으로 변환
[(1, 'apple', 'red'), (2, 'banana', 'yellow'), (3, 'orange', 'orange')]
또한 for문에서 zip 함수를 이용하면 다음과 같습니다.
>>> for x, y in zip(range(10), range(10)): # 두개의 0~9까지 숫자모음
>>> print(x, y)
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
range 함수를 이용해서 0~9로 이루어진 두개의 숫자 데이터를 생성해서 zip 함수를 이용해 묶어줍니다. for 문 안에서는 변수는 x,y 두개를 사용해야합니다.
이제 zip에 대해 알았으니 .. 다른 사람들은 어떻게 이 문제를 해결했는지 다시보겠습니다 .
def solution(phoneBook):
phoneBook = sorted(phoneBook)
for p1, p2 in zip(phoneBook, phoneBook[1:]):
if p2.startswith(p1):
return False
return True
문자 길이에 상관없이 정렬 후, 접두사 비교시, 나머지 번호가 아닌 바로 다음 전화번호와 비교합니다.
#startwith
- 문자열에서 특정 문자로 시작하는 문자열을 찾을 때 사용합니다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] - 정렬. K번째 수 (0) | 2023.04.20 |
---|---|
[프로그래머스] - 스택/큐. 기능개발 (0) | 2023.03.06 |
[프로그래머스] - 스택/큐.같은 숫자는 싫어 (0) | 2023.03.06 |
[프로그래머스] - 해시 . 완주하지 못한 선수 (2) | 2023.02.28 |