프로그래머스 LV1 "핸드폰 번호 가리기"
프로그래머스 Lv1 핸드폰 번호 가리기
기초부터 다시 공부를 하기위해 프로그래머스 라는 사이트에서 코딩테스트를 LV0 부터 가능한곳까지 못하는곳은 레퍼런스를 찾아가며 풀어보려고 합니다.
매일 1개의 풀이를 하고 그 풀이에대한 나의 생각 및 해석을 적어보려합니다.
오늘은 LV1 스무번째 문제 ‘핸드폰 번호 가리기’ 문제입니다.
위 이미지가 프로그래머스 코딩문제입니다.
문제는 매개변수로 문자열 phone_number
를 입력받아 뒤 4자리의 문자열 빼고 전부 *
으로 변환한 후 출력하는 문제입니다.
오늘 문제에서는 정규식을 이용해 문제를 해결해 보겠습니다.
그럼 오늘의 문제를 한번 풀어보겠습니다.
기본 세팅 코드도 알아보겠습니다.
1
2
3
4
function solution(phone_number) {
var answer = '';
return answer;
}
기본 세팅 코드는 매개변수 phone_number
문자열이 입력되고 함수 안에는 answer
이라는 변수가 선언되어 빈 문자열을 리턴하는 간단한 기본 세팅 코드입니다.
우선 문제를 알가보기 전에 ‘정규 표현식’이 무엇인지 한번 간단하게 알아보고 문제를 해결해 보겠습니다.
정규 표현식
정규 표현식(Regular Expression)은 특정한 패턴을 표현하기 위한 문자열입니다. 주로 문자열을 검색하거나 특정한 패턴을 찾을 때 사용됩니다. 예를 들어, 이메일 주소, 전화번호, 혹은 특정한 형식의 문장을 찾거나 변형할 때 유용하게 사용될 수 있습니다.
정규 표현식은 다양한 문자와 기호들의 조합으로 이루어집니다. 예를 들어:
.
: 어떤 문자 하나와 일치합니다.*
: 앞에 있는 패턴이 0번 이상 반복되는 부분과 일치합니다.+
: 앞에 있는 패턴이 1번 이상 반복되는 부분과 일치합니다.?
: 앞에 있는 패턴이 0번 또는 1번 등장하는 부분과 일치합니다.[]
: 괄호 안에 있는 문자 중 하나와 일치합니다.()
: 그룹을 나타내며, 일치하는 부분을 추출할 수 있습니다.\d
: 숫자 하나와 일치합니다.\w
: 문자나 숫자와 일치합니다.
예를 들어, 이메일 주소를 찾는 패턴을 만들어보면 다음과 같습니다: \b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b
이 패턴은 이메일 주소의 일반적인 형식을 나타냅니다.
하지만 정규 표현식은 간단한 것부터 복잡한 것까지 다양하게 작성될 수 있습니다.
아래는 정규 표현식을 정리한 간단한 테이블 입니다.
패턴 | 설명 | 예시 |
---|---|---|
\d | 숫자에 대응 | “123”, “456” 등 |
\D | 숫자가 아닌 문자에 대응 | “hello”, “world” 등 |
\w | 문자에 대응 (알파벳, 숫자, 밑줄) | “hello”, “world_123” 등 |
\W | 문자가 아닌 것에 대응 | ”@”, “&” 등 |
\s | 공백 문자에 대응 | ” “, “\t”, “\n” 등 |
\S | 공백이 아닌 문자에 대응 | “hello”, “world” 등 |
^ | 문자열의 시작 부분에 대응 | “^hello”는 “hello world”에 대응하지만 “world hello”에는 대응하지 않음 |
$ | 문자열의 끝 부분에 대응 | “world$”는 “hello world”에 대응하지만 “world hello”에는 대응하지 않음 |
. | 임의의 문자에 대응 | “a”, “b”, “1”, “$” 등 |
[abc] | 괄호 안에 있는 문자 중 하나에 대응 | “a”, “b”, “c” 중 하나에 대응 |
[^abc] | 괄호 안에 없는 문자에 대응 | “d”, “e”, “f” 등 |
[a-z] | a부터 z까지의 모든 소문자 알파벳에 대응 | “a”, “b”, …, “z” 등 |
[0-9] | 0부터 9까지의 모든 숫자에 대응 | “0”, “1”, …, “9” 등 |
* | 앞의 패턴이 0번 이상 반복되는 것에 대응 | “aaa”, “a”, “” 등 |
+ | 앞의 패턴이 1번 이상 반복되는 것에 대응 | “aaa”, “aa”, “a” 등 |
? | 앞의 패턴이 0번 또는 1번 나오는 것에 대응 | “a”, “” 등 |
{n} | 앞의 패턴이 n번 나오는 것에 대응 | “aaa”, “111” 등 |
{n,} | 앞의 패턴이 최소 n번 이상 나오는 것에 대응 | “aaa”, “1111” 등 |
{n,m} | 앞의 패턴이 최소 n번 이상 최대 m번 이하로 나오는 것에 대응 | “aaa”, “111”, “1111” 등 |
(pattern) | 괄호 안의 패턴을 그룹화하여 대응 | “abc”, “def” 등 |
\b | 단어 경계에 대응 | “\bword\b”는 “word”에 대응하지만 “keyword”에는 대응하지 않음 |
\B | 단어 경계가 아닌 부분에 대응 | “keyword” 등 |
(?=…) | 전방 탐색 (뒤에 …)이 오는 경우에 대응 | “good(?=bye)”는 “goodbye”에 대응하지만 “goodnight”에는 대응하지 않음 |
(?!…) | 부정형 전방 탐색 (뒤에 …)이 오지 않는 경우에 대응 | “good(?!bye)”는 “goodnight”에 대응하지만 “goodbye”에는 대응하지 않음 |
(?<=…) | 후방 탐색 (앞에 …)이 오는 경우에 대응 | ”(?<=hello)world”는 “helloworld”에 대응하지만 “world”에는 대응하지 않음 |
(?<!…) | 부정형 후방 탐색 (앞에 …)이 오지 않는 경우에 대응 | ”(?<!hello)world”는 “world”에 대응하지만 “helloworld”에는 대응하지 않음 |
[가-힣] | 한글에 대응 | “안녕하세요”, “한글” 등 |
[ㄱ-ㅎㅏ-ㅣ] | 자음과 모음에 대응 | “가나다라마바사아자차카타파하” 등 |
[가-힣ㄱ-ㅎㅏ-ㅣ] | 한글, 자음, 모음에 대응 | “안녕하세요”, “가나다라”, “ㅏㅑㅓㅕㅣ” 등 |
이렇게 정규표현식에 대해 알아보았습니다. 처음엔 어렵고 복잡해보이지만 한번 익숙해지면 편리하고 강력한 기술이 될 수 있습니다.
그럼 정규표현식을 이용해 문제의 답을 한번 적어보겠습니다.
1
2
3
4
function solution(phone_number) {
var answer = phone_number.replace(/.(?=.{4})/g, "*");
return answer;
}
문제의 식이 완성되었으니 프로그래머스에 한번 확인해보겠습니다.
성공이네요!
오늘은 프로그래머스 LV1 ‘핸드폰 번호 가리기’ 문제의 대해서 알아봤습니다.
제 방법이 꼭 정답은 아니니 그저 이런방법도 있구나하고 참고용으로만 봐주시면 감사하겠습니다.
감사합니다.