RUBY

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

PS/Programmers

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

RUBY_루비 2020. 10. 22. 23:59

출처:: programmers.co.kr/learn/courses/30/lessons/42577

분류:: 해시

 

1. 문제 이해 및 해결과정

 1. 정렬

- phone_book을 정렬하면, 12 123,1234 와 같이 정렬된다. 
- 리스트 내에서, 앞의 수와 뒤의 수 끼리만 확인하면 된다  

 

 

2. 풀이방법

  1. [ python ] 정렬

- 생각해보니 이 풀이는 ["146","2146"]의 경우는 통과되면 안되는데 이것이 답이 되었다. --????

- 이 테스트케이스는 포함하는 경우이기 때문이다 

- 접두사해 포함해야 하므로 아래 풀이는 틀린 풀이이다

def solution(phone_book):
    phone_book.sort() #정렬을 하게되면, 앞뒤의 숫자만 비교하면 된다
    for i in range(len(phone_book)-1):
        if phone_book[i] in phone_book[i+1] :#앞의것이 뒤의 것에 포함된다면 
            return False #어떤번호가 다른번호의 접두어인 경우가 있다 
    return True #접두어인 경우가 없다 

  2. [ python ] zip + startswith

def solution(phone_book):
    phone_book.sort()
    for x,y in zip(phone_book,phone_book[1:]):
        if y.startswith(x): #y가 x로 시작하면
            return False
    return True

3. 해시

def solution(phone_book):
    answer=True 
    dict={}
    for phone_number in phone_book:
        dict[phone_number]=1  #key:폰번호 value: 1
    
    for phone_number in phone_book:
        tmp=""
        for x in phone_number: #phone_number 123이라면
            tmp+=x #tmp에는 1, 12, 123이 된다 
            if tmp in dict and tmp!=phone_number: #현재 폰번호가 아니고 dict에 있을 경우
                answer=False
    return answer

 

3. 오답원인

 

4. 알게된 점

zip()

: 동일한 개수의 자료형을 묶어주는 함수 

a=[1,2,3,4,5,6,7] 

#a[1:]=[2,3,4,5,6]

for x,y in zip(a,a[1:]):
	print(x,y)

#이렇게 결과 쌍이 나온다 
1 2
2 3
3 4
4 5
5 6
6 7
    
str.startswith(str2)

: str이 str2라는 문자로 시작할 경우 True, 아니라면 False 반환

str1.startswith(str2,begin,end) #문자열str1의 begin부터 end전까지 중 문자열str2를 찾는다
#찾을 수 있으면 True
#아니면 False

 

'PS > Programmers' 카테고리의 다른 글

[프로그래머스] 위장  (0) 2020.10.23
[프로그래머스] 가장 큰 정사각형 찾기  (0) 2020.10.23
[프로그래머스] H-Index  (1) 2020.10.22
[프로그래머스] 구명보트  (0) 2020.10.22
[프로그래머스] 프린터  (0) 2020.10.21
Comments