문제 설명
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
- 구조대 : 119
- 박준영 : 97 674 223
- 지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
제한 사항- phone_book의 길이는 1 이상 1,000,000 이하입니다.
- 각 전화번호의 길이는 1 이상 20 이하입니다.
- 같은 전화번호가 중복해서 들어있지 않습니다.
["119", "97674223", "1195524421"] | false |
["123","456","789"] | true |
["12","123","1235","567","88"] | false |
입출력 예 #1
앞에서 설명한 예와 같습니다.
입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.
입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.
( 문제 해설 )
해쉬 즉, 딕셔너리를 이용하면 비교적 쉽게 풀 수 있습니다.
hash = ["119", "97674223", "1195524421"]가 주어질 때
"119" key로 value를 1로 지정해서
그럼 dic은 {'119': 1, '97674223': 1, '1195524421': 1} 이렇게 됩니다.
hash를 순회하면서 해당 목록이 있는지만 체크해주면 됩니다.
hash [0]을 체크할 때
prefix= ""라는 빈 문자열 변수에 하나씩 넣어줍니다
1. prefix = "1" 은 dic에 거짓
2. prefix = "12" 도 거짓
3. prefix = "123" 은 존재하지만 본인이기 때문에 거짓 -> 이 부분 예외처리 조건이 필요하겠죠!
hash [1]을 체크할 때
1. prefix ="9" 거짓
2. prefix = "97" 거짓
....
이런 식으로 체크하는 방법으로 알고리즘을 짜서 문제를 풀 수 있습니다
[ 코드 ]
# 2. 전화번호 목록 ( 해쉬 이용 )
def solution(phone_book):
answer = True
dic = {}
for p in phone_book:
dic[p] = 1
print(dic)
for p in phone_book:
prefix = ""
# print(p)
for n in p:
prefix += n
print(prefix)
if prefix in dic and prefix != p:
return False
return answer
p_b = ["119", "97674223", "1195524421"]
p_b1 = ["123","456","789"]
sol = solution(p_b)
print(sol)
후기
쉬운 문제지만
해쉬를 왜 써야 하는지
즉, 딕셔너리의 유용함을 잘 알 수 있는 좋은 문제였습니다.
'프로그래머스 고득점kit > 해시' 카테고리의 다른 글
[고득점 kit] 프로그래머스 코딩테스트 연습 - [해쉬] - #4. 베스트 앨범 (0) | 2022.03.22 |
---|---|
[고득점 kit] 프로그래머스 코딩테스트 연습 - [해쉬] - #3. 위장 (0) | 2022.03.18 |
프로그래머스 코딩테스트 연습 - [해쉬] - #1. 완주하지 못한 선수 (0) | 2022.03.08 |