티스토리 뷰

728x90

해시 level 2 문제 입니다.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

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

구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

제한 사항
phone_book의 길이는 1 이상 1,000,000 이하입니다.
각 전화번호의 길이는 1 이상 20 이하입니다.
같은 전화번호가 중복해서 들어있지 않습니다.

 


문제 접근

우선 내가 문제에서 중요하다고 생각한건 다음과 같다.

1. 접두어란 무엇인가

2. 개수를 세는 것이 아니라 True / False 만 체크하는 것

 

접두어는 맨 앞에 있는 글자들을 말하는 듯 했고 그래서 문자열에 해당 직전 문자열이 있으면 False 로 체크하도록 했다.


 

 

내가 작성한 답

첫 시도에서는 string에서 특정 문자열을 찾기 위해서 in 을 사용해서 풀었다. 하지만 in은 접두어 라는 조건에 알맞지 않은 방법이란 것을 늦게 깨달았다.

 

두 번째 시도에서는 아래와 같이 했는데, 틀렸다고 나왔다.

왜인지 생각해보다가 아마 리스트 마지막까지 접두어로 겹치는 것이 없을 때 에러가 발생해서 그런 것이 아닐까 라고 생각했다. 실제로 91.7 점까지 나왔지만 100점이 안나와서 다시 시도해봤다.

def solution(phone_book_origin):
    phone_book = sorted(phone_book_origin, key=len)
    if len(phone_book) == 1:
        return True
    for i in range(len(phone_book)):
        for j in range(i+1,len(phone_book)):
            if phone_book[i] == phone_book[j][:len(phone_book[i])]:
                return False
    return True

 

 

세 번째 시도에서는 새로운 시도를 해봤다.

리스트를 정렬했을 때, 무조건 자기 다음 요소는 자신을 포함하거나 안하거나 이다. 그 다다음 요소는 다음 요소보다 자기와 같은 확률이 낮다. ( 정렬하게 되면 멀어질 수록 자기와 다르다. )

그래서 딱 자기의 길이만큼만 비교하면 된다. 그래서 굳이 for 문을 2개씩 쓰지 않아도 된다는 사실을 깨달았다.

그제서야 100점이 나왔따.

 

def solution(phone_book):
    phone_book.sort() # 접두어가 되기 위해선 길이가 짧거나 같아야하므로 정렬
    # 정렬되는 방식이 오름차순으로 정리하고 앞자리가 같다면 길이도 오름차순으로 정렬된다. 
    print(phone_book)
    for i in range(0,len(phone_book)-1): # 자기 자신과 그 다음을 계속 비교함
        # 문자열을 정렬했기 때문에, 다음 요소는 자신을 포함하거나 안하거나 둘 중 하나.. 
        # 그래서 자신의 길이만큼만 비교하면 됨
        if phone_book[i] == phone_book[i+1][0:len(phone_book[i])]: # 그러다가 자신의 길이만큼 다른 요소가 같다면 접두어라고 판단
            return False
    return True

 

728x90
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크