LinkLine에 합류했어요. LinkLine은 모두가 안정적으로 연결될 수 있도록 하는 일을 하는 선도적인 통신 회사예요. 팀은 큰 도전에 맞닥뜨렸어요. 사용자들이 전화번호를 온갖 형식으로 입력하기 때문이에요. 하이픈, 공백, 마침표, 괄호, 심지어 접두사까지요. 어떤 번호는 유효하고, 어떤 번호는 도저히 쓸 수 없어요.
임무는 이 혼란을 질서로 바꾸는 거예요. 유효한 번호는 깔끔하게 정리해서 시스템에서 쓰기 알맞은 형식으로 다듬어요. 동시에 유효하지 않은 항목은 찾아내 걸러내요.
LinkLine의 운영이 성공할지는 쓸모 있는 번호와 그렇지 않은 번호를 얼마나 잘 구분하느냐에 달려 있어요. 이 도전을 받아들여 모두의 연결이 매끄럽게 이어지도록 할 준비가 됐나요?
SMS 메시지를 보낼 수 있도록 전화번호를 정리해요.
북미 번호 계획(NANP) 은 미국, 캐나다, 버뮤다 등 북미의 여러 나라에서 사용하는 전화 번호 체계예요.
모든 NANP 국가는 동일한 국제 국가 코드 1을 공유해요.
NANP 번호는 열 자리 숫자로, 흔히 _지역 코드_라고 부르는 세 자리 번호 계획 지역 코드와 그 뒤에 오는 일곱 자리 지역 번호로 이루어져 있어요. 지역 번호의 처음 세 자리는 _국번_을 나타내고, 그 뒤에 오는 고유한 네 자리 숫자가 _가입자 번호_예요.
형식은 보통 다음과 같이 나타내요
NXX NXX-XXXX
여기서 N은 2부터 9까지의 숫자이고, X는 0부터 9까지의 숫자예요.
때로는 국가 코드(1 또는 +1)가 앞에 붙기도 해요.
여러분의 과제는 다양한 형식의 전화번호에서 구두점과 국가 코드(있는 경우)를 제거해서 정리하는 거예요.
예를 들어, 다음 입력은
+1 (613)-995-0253613-995-02531 613 995 0253613.995.0253모두 다음과 같은 출력을 만들어야 해요
6139950253
참고: 이 연습 문제는 NANP 국가에서 사용하는 전화번호만 다루므로, 국가 코드로는 1만 유효한 것으로 간주해요.
때로는 예외를 발생시켜야 할 때가 있어요. 이럴 때는 오류의 원인이 무엇인지 알려 주는 의미 있는 오류 메시지를 항상 함께 넣어야 해요. 그래야 코드가 더 읽기 쉬워지고 디버깅에도 큰 도움이 돼요. 오류 원인이 특정 유형이라고 확실한 상황이라면 내장 오류 유형 중 하나를 발생시켜도 되지만, 그래도 의미 있는 메시지는 꼭 함께 넣어야 해요.
이 연습 문제에서는 PhoneNumber() 클래스 생성자에 _유효한 전화번호_가 아닌 숫자가 전달되면 raise 문으로 여러 개의 ValueError를 "던져야" 해요. 여기에는 지역 번호나 국번이 유효하지 않은 경우, 자릿수가 너무 많거나 너무 적은 경우, 입력으로 구두점이나 문자가 들어온 경우가 모두 포함돼요. exception을 raise하면서 메시지도 함께 넣어야만 테스트가 통과해요.
메시지와 함께 ValueErrors를 발생시키려면, 메시지를 exception 타입의 인자로 적어요:
# if a phone number has less than 10 digits.
raise ValueError("must not be fewer than 10 digits")
# if a phone number has more than 11 digits.
raise ValueError("must not be greater than 11 digits")
# if a phone number has 11 digits, but starts with a number other than 1.
raise ValueError("11 digits must start with 1")
# if a phone number has an exchange code that starts with 0.
raise ValueError("exchange code cannot start with zero")
# if a phone number has an exchange code that starts with 1.
raise ValueError("exchange code cannot start with one")
# if a phone number has an area code that starts with 0.
raise ValueError("area code cannot start with zero")
# if a phone number has an area code that starts with 1.
raise ValueError("area code cannot start with one")
# if a phone number has punctuation in place of some digits.
raise ValueError("punctuations not permitted")
# if a phone number has letters in place of some digits.
raise ValueError("letters not permitted")
Exercism에 가입하고 Python 트랙을 개념 17개연습 문제 146개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.