새소식

⌨️ Algorithms/프로그래머스

[Python] 프로그래머스 Lv2_전화번호 목록

2022. 12. 22. 19:54

  • -

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

 

프로그래머스

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

programmers.co.kr

 

  • 한 번호가 다른 번호의 접두어인 경우가 있는지 확인
  • phone_book: 전화번호부에 적힌 전화번호를 담은 배열
  • 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return

제한 사항

  • phone_book의 길이는 1 이상 1,000,000 이하
    • 각 전화번호의 길이는 1 이상 20 이하
    • 같은 전화번호가 중복해서 들어있지 않음

 

"""
입출력 예시)

phone_book = ["119", "97674223", "1195524421"] -> false
phone_book = ["123","456","789"] -> true
phone_book = ["12","123","1235","567","88"] -> false
"""

 

# phone_book = ["119", "97674223", "1195524421"]

# 구조대 : 119
# 박준영 : 97 674 223
# 지영석 : 11 9552 4421

# -> 구조대 전화번호는 영석이의 전화번호의 접두사

 

 

## 의사코드 ##
# ! 접두어인 경우가 있을 때가 false / 없을 때는 true ! #

# 어떤 번호가 다른 번호의 접두어인지 확인 -> str.startswith()

# 현재 전화번호가 다른 전화번호의 접두어인지 확인하는 방법
# phone_book을 정렬 -> 전화번호의 맨 앞자리 수를 기준으로 순서대로 정렬됨
# for문
#   if p[i+1].startswith(p[i]):
#       answer = False
#   else:
#       answer = True

 

 

통과한 코드

 

def solution(phone_book):
    answer = True
    phone_book.sort() # 전화번호의 맨 앞자리 수를 기준으로 순서대로 정렬
    for i in range(len(phone_book)-1):
        if phone_book[i+1].startswith(phone_book[i]):
            return False
    return answer

-> sort()로 정렬 후, startswith()로 확인

 

  • startswith()
    • 문자열이 특정 문자열로 시작하는지 확인
  • in
    • 특정 문자열이 문자열에 포함되어 있는지 확인

 

# in과 startswith 비교

s = "12"
num = "531235"

# in -> True
print("'in':", s in num)

# startswith -> false
print("'startswith':", num.startswith(s))

 

# sort() -> 전화번호의 맨 앞자리 수를 기준으로 순서대로 정렬
phone_book = ["119", "97674223", "1195524421"]
phone_book.sort()
print(phone_book)

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

-> 전화번호가 int가 아닌 str으로 되어 있어서 전화번호의 맨 앞자리 수를 기준으로 정렬됨

 

 

  • for문
    • for i in range(len(phone_book)-1) 하는 이유: IndexError를 피하기 위해
# ex) 
phone_book = ["119", "97674223", "1195524421"]
for i in range(len(phone_book)-1):
    print(i) # -> 0, 1

    if phone_book[i+1].startswith(phone_book[i]):
#      -> phone_book[1]과 phone_book[0]
#      -> phone_book[2]과 phone_book[1]

 

 

 

 

다른 풀이

 

1. zip() 이용

def solution(phone_book):
    phone_book = sorted(phone_book)

    for p1, p2 in zip(phone_book, phone_book[1:]):
        if p2.startswith(p1):
            return False
    return True

 

# ex) 
phone_book = ["119", "97674223", "1195524421"]
phone_book = sorted(phone_book)
for p1, p2 in zip(phone_book, phone_book[1:]):
    print(p1, p2)
    
"""
119 1195524421
1195524421 97674223
"""

 

 

2. Hash 이용

 

def solution(phone_book):
    answer = True

    # 해시 생성
    hash_map = {}
    # 해시에 전화번호 추가
    for phone_number in phone_book:
        hash_map[phone_number] = 1 # {전화번호: 1, 전화번호: 1, ...} 
        # -> key: phone_number / value: 1 
        # (value = 1 => 숫자가 1개 존재한다는 의미)
    
    for phone_number in phone_book:
        temp = ""
        for number in phone_number:
            temp += number
            # temp가 해시에 존재하고, 전화번호와 같지 않은 경우 (=> 다른 번호의 접두어인 경우)
            if temp in hash_map and temp != phone_number:
                return False # answer = False라고 하는 것보다 바로 return False를 하는 게 시간이 더 빠름 
    return answer

-> 전화번호를 한 글자씩 돌면서 그 번호가 접두어인지를 확인

 

# 과정 확인

"""

 hash_map = {'119': 1, '97674223': 1, '1195524421': 1} 

number: 1
phone_number: 119
temp += number: 1 

number: 1
phone_number: 119
temp += number: 11 

number: 9
phone_number: 119
temp += number: 119 

number: 9
phone_number: 97674223
temp += number: 9 

number: 7
phone_number: 97674223
temp += number: 97 

number: 6
phone_number: 97674223
temp += number: 976 

number: 7
phone_number: 97674223
temp += number: 9767 

number: 4
phone_number: 97674223
temp += number: 97674 

number: 2
phone_number: 97674223
temp += number: 976742 

number: 2
phone_number: 97674223
temp += number: 9767422 

number: 3
phone_number: 97674223
temp += number: 97674223 

number: 1
phone_number: 1195524421
temp += number: 1 

number: 1
phone_number: 1195524421
temp += number: 11 

number: 9
phone_number: 1195524421
temp += number: 119 
"""

 

 

 

 

참고)

 

https://codechacha.com/ko/python-find-something-starts-with-string/

 

Python - String startswith(), 어떤 문자열로 시작하는지 확인

startswith()를 이용하여 문자열이 특정 문자열로 시작하는지 확인할 수 있습니다. 예를 들어 다음과 같이 'Hello world, Python!'가 Hello로 시작하는지 확인할 수 있습니다. 만약 어떤 문자열이 포함하고

codechacha.com

 

https://codechacha.com/ko/python-find-str-in-str/

 

Python - 문자열에 특정 문자열이 포함되어있는지 확인

Python의 문자열에서 어떤 문자열이 포함되어있는지 확인하는 방법을 소개합니다. `if "string" in ??`를 사용하여 특정 문자열이 포함되어있는지 확인할 수 있습니다. `find()`는 문자열에 인자로 전달

codechacha.com

 

https://coding-grandpa.tistory.com/86

 

[프로그래머스] 전화번호 목록 문제 풀이(해시 Lv. 2) - 파이썬 Python

0. 동일 유형 문제 [프로그래머스] 완주하지 못한 선수 (해시 Lv. 1) [프로그래머스] 전화번호 목록 (해시 Lv. 2) [프로그래머스] 위장 (해시 Lv. 2) [프로그래머스] 베스트 앨범 (해시 Lv. 3) Youtube 영상으

coding-grandpa.tistory.com

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!