minzzl

[프로그래머스] - 해시.전화번호 목록 본문

Algorithm/프로그래머스

[프로그래머스] - 해시.전화번호 목록

minzzl 2023. 2. 28. 11:16
728x90
반응형

네.. 어제 활활 불타오르던 의욕은 어디에 가고 ...

오늘 이렇게 해시 세번째 문제를 풀었습니다 ..

어제 완료하기로 했지만 뭐 ,,, ^^ 지금이라도 하는게 어디에요 ~

 

문제

 

 

풀이

 

근데 이 문제 좀 화납니다잉 ..

해시 대표 문제면 뭔가 해시를 쓸만한 타당성?을 줘야하는 문제여야하지 않나여 ? 

왜 혼란을 주시는거져 ? ㅜ

(사실 내가 알고리즘 잘 못해서 화나는 고임)

 

쨋든 

굳이 굳이 ... 각 번호들을 .. 해시 테이블에 넣고요 ...

그냥 문자열 비교합니다 ...

 

심지어 대표 코드 정답은 해시로 안 품요 

 

 

나의 코드

 

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 

 

- 문자열에서 특정 문자로 시작하는 문자열을 찾을 때 사용합니다.

728x90
반응형