일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 도커
- 컨테이너
- 코딩 테스트
- coding test
- 프로그래머스
- docker
- Cosmos
- 트레바리
- db
- database
- snort
- osi7layer
- 스노트
- 라우팅프로토콜
- Container
- Linux
- TDD
- MySQL
- Routing
- 라우팅
- OSI7계층
- 리눅스
- 코딩테스트
- 라우터
- 스노트 룰
- 데이터베이스
- Python
- Snort Rule
- programmers
- Router
- Today
- Total
Simple is IT, 누구나 보고 누구나 깨닫는 IT
[Coding Test] Programmers_전화번호 목록 본문
이런 부분은 이렇게 사용했으면 좋겠다! 싶거나 추가했으면 하는 내용은 과감히 댓글 부탁드립니다.
[전화번호 목록]
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
-
구조대 : 119
-
박준영 : 97 674 223
-
지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
제한 사항
-
phone_book의 길이는 1 이상 1,000,000 이하입니다.
-
각 전화번호의 길이는 1 이상 20 이하입니다.
입출력 예 #1
앞에서 설명한 예와 같습니다.
input:
["119","97674223","1195524421"]
output:
false
입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.
input:
["123","456","789"]
output:
true
입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.
input:
["12","123","1235","567","88"]
output:
false
전화번호 목록에서 서로서로를 모두 비교해 나가야겠다고 생각했어요. 그래서 이중 for문과 if문을 이용해 원하는 결과를 이끌어내려고 했죠.
def solution(phone_book):
for i in range(len(phone_book)):
for j in range(len(phone_book)):
if phone_book[i] in phone_book[j] and i != j:
return False
return True
해당 코드로는 테스트 케이스 1, 5를 통과하지 못 했어요. 무엇을 빠뜨렸나 곰곰히 생각을 해보았죠.
우리는 phone_book의 전화번호를 비교할 때 '접두어'를 확인하는 것이 목적이지, '해당 전화번호가 포함되어 있나?'를 보는게 아닙니다! 그걸 고려해 작성하니 효율성과 정확성에 통과한 코드가 나왔죠.
def solution(phone_book):
leng = len(phone_book)
for i in range(leng):
for j in range(leng):
if phone_book[i] in phone_book[j][:len(phone_book[i])] and i != j:
return False
return True
-
반복문을 위해 처음에 leng이라는 변수로 phone_book의 길이 정수를 저장했어요.
-
이중 for문을 통해 서로를 비교해요. 이때는 비교 기준의 전화번호 길이만큼 비교당하는 전화번호 길이를 뽑아와 서로가 일치한지를 확인합니다!
-
서로 같은 전화번호는 비교하지 않습니다.
정확성과 효율성의 결과
[정확성 테스트]
테스트 1 〉 통과 (0.04ms, 10.7MB)
테스트 2 〉 통과 (0.04ms, 10.8MB)
테스트 3 〉 통과 (0.03ms, 10.7MB)
테스트 4 〉 통과 (0.04ms, 10.6MB)
테스트 5 〉 통과 (0.04ms, 10.7MB)
테스트 6 〉 통과 (0.04ms, 10.7MB)
테스트 7 〉 통과 (0.05ms, 10.7MB)
테스트 8 〉 통과 (0.06ms, 10.7MB)
테스트 9 〉 통과 (0.03ms, 10.8MB)
테스트 10 〉 통과 (0.04ms, 10.7MB)
테스트 11 〉 통과 (0.04ms, 10.7MB)
[효율성 테스트]
테스트 1 〉 통과 (1.79ms, 15.2MB)
테스트 2 〉 통과 (1.65ms, 15.3MB)
그리고 많은 분들이 작성했던 코드에요. 파이썬스럽고 깔끔한게 보기 너무 좋습니다!
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
[효율성 테스트]에서는 저와 약 2배차이가 나는군요.
[효율성 테스트]
테스트 1 〉 통과 (3.22ms, 15.3MB)
테스트 2 〉 통과 (3.12ms, 15.4MB)
'Simple is IT > Programming' 카테고리의 다른 글
[Coding Test] BOJ_UCPC 2020_전단지 돌리기 (0) | 2020.08.13 |
---|---|
[Coding Test] Programmers_K번째수 (0) | 2020.08.09 |
[Coding Test] Programmers_완주하지 못한 선수 (0) | 2020.08.05 |
[Coding Test] Programmers_2020 카카오 블라인드 채용_문자열 압축 (0) | 2020.08.03 |
[Coding Test] Goorm Level_어느 개발자 이야기 (0) | 2020.08.01 |