ProblemSolving/Hash

프로그래머스 전화번호 목록 (파이썬)

OSNIM 2022. 5. 3. 18:45
반응형

Level 2 해시

 

문제 : https://programmers.co.kr/learn/courses/30/lessons/42577

 

코딩테스트 연습 - 전화번호 목록

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조

programmers.co.kr

제출 코드

def solution(phone_book):
    answer = True
    phone_book.sort(key = lambda x : (x, len))

    for i in range(len(phone_book)-1):
        left = phone_book[i]
        right = phone_book[i+1]
        if left == right[:len(left)]:
            answer = False
            return answer

    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 함수를 이용해서 앞 변수를 순서대로 튜플을 만들어 반환

["119", "1195524421"], ["1195524421", "97674223"]

startswith(p1)를 사용해서 문자열의 시작지점에서 p1이 있는지 확인

p2 = "1195524421"

p2.startswith("119") # True 

 

 

정리 및 복습

처음에는 전화번호를 단순하게  sort() 정렬만 해서 길이가 우선이 아닌 첫 문자 순서로 정렬되어 문제의 의도와 다르게 풀었습니다.

1. sort에 lambda 안에 len이라는 내장함수를 바로 쓸 수 있는지 처음 깨달았습니다.

2. 정렬에서 우선순위를 값, 길이로 정하고 i와 i+1만을 비교하여 for문을 2중이 아닌 1개로만 풀 수 있었습니다.

3. startwith 이라는 문자열 내장 함수를 새롭게 알았습니다.

 

 

반응형