-
(프로그래머스) 코딩테스트 연습 > 해시 > 전화번호 목록코딩연습 2020. 3. 19. 01:18
전화 번호부가 주어지고 한 번호가 다른 번호의 접두사인 경우 False 그렇지 않으면 True를 반환하는 문제이다. 이문제가 왜 해시로 분류되는지 잘 모르겠다. 전화번호부라는 것 때문인가... 여튼 해시로 어떻게 풀어야할지 잘몰라서 그냥 풀었다.
from itertools import combinations def solution(phone_book): for two in combinations(phone_book, 2): num = sorted(list(two)) a, b = num[0], num[1] diff = int(b[::-1]) - int(a[::-1]) div = 10**len(num[0]) if diff % div == 0: return False return True
일단 전화번호 두개를 뽑아서 비교를 해야겠기에 itertools의 combinations를 사용하였다. 2개 중 작은 쪽과 큰쪽을 분류하려고 정렬을 하고, 각 숫자를 뒤집어서 빼었다. 예를 들어 "11322"와 "113"이 있다고 했을 때, 뒤집어서 빼면 22311-311=22000이 된다. 그리고 1000으로 나눈 나머지가 0이 됨을 알 수 있다. 만일 두 숫자중에 어느 누구도 접두사가 아니라면 나머지가 0이 아니다. ex) "123", "345" -> 543 - 321 = 222 -> 222%1000 = 222 이렇게 해서 이문제를 해결하고 나면 프로그래머스는 다른 사람들의 코드를 볼 수 있게 해준다. 거기서 startswith라는 list attribute함수를 알게 되었다. str.startswith(x) 라고 사용하면 str이라는 문자열이 x로 시작하는지 판별을 해준다.
from itertools import combinations def solution(phone_book): for two in combinations(phone_book, 2): num = sorted(two) if num[1].startswith(num[0]): return False return True
이렇게 하니 코드의 의미가 한결 명확해져서 이해하기가 쉬워졌다. 효율성 테스트에서 0.15ms, 0.24ms정도 나오는데 이 거보다 더 높은 효율을 내는 사람들도 있는 것 같다. 아직 갈길이 너무나도 멀다.
'코딩연습' 카테고리의 다른 글
같은 숫자는 싫어 (0) 2020.08.02 두 정수 사이의 합 (0) 2020.07.30 (프로그래머스) 코딩테스트 연습 > 해시 > 위장 (0) 2020.03.25 (프로그래머스) 코딩테스트 연습 > 그리디 > 저울 (0) 2020.03.25 (프로그래머스) 코딩테스트 연습 > 그리디 > 체육복 (0) 2020.03.19