일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- JS 함수
- JS 화살표함수
- JS setTimeout
- JS redirection
- JS 기초
- JS null undefined
- JS preventDefault
- JS append
- HTML기초
- JS appendChild
- JS form action
- JS 연산
- js 변수
- JS value속성
- JS 삼항연산
- JS 데이터타입
- JS classList
- CSS속성정리
- JS form
- JS setInterval
- JS clearInterval
- JS 숫자
- JS 형변환
- JS 스코프
- JS 타이머기능
- git 협업셋팅
- JS prompt
- JS localStorage
- JS typeof연산자
- CSS기초
공부기록용
프로그래머스(LV 1. 핸드폰 번호 가리기) 본문
LV 1. 핸드폰 번호 가리기
https://school.programmers.co.kr/learn/courses/30/lessons/12948
문제 설명
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.
- phone_number는 길이 4 이상, 20이하인 문자열입니다.
입출력 예
- phone_number = "01033334444"
- return = "*******4444"
<해결>
function solution(phone_number) { var answer = ''; answer = "*".repeat(phone_number.length - 4) + phone_number.slice(-4); // return "*".repeat(phone_number.length - 4).concat(phone_number.slice(-4)); // phone_number.length의 -4까지 *을 반복하고, 붙여줘(+로 형 변환) // phone_number의 배열에서 뒤에서 4번째까지 잘라서 return answer; } console.log(solution("01033334444"))
🔴배운거 정리
> .join
> .join("") : 배열의 원소를 문자열로 합치기
var a = ['바람', '비', '불'];
var myVar1 = a.join(); // myVar1에 '바람,비,불'을 대입
var myVar2 = a.join(', '); // myVar2에 '바람, 비, 불'을 대입
var myVar3 = a.join(' + '); // myVar3에 '바람 + 비 + 불'을 대입
var myVar4 = a.join(''); // myVar4에 '바람비불'을 대입
// 바람,비,불
// 바람, 비, 불
// 바람 + 비 + 불
// 바람비불
> .charAt()
> .charAt() : 함수는 문자열에서 특정 인덱스에 위치하는 유니코드 단일문자를 반환
str.charAt(index)
- 문자열 내의 문자는 왼쪽에서 오른쪽으로 순번(인덱스)이 매겨집니다.
- 0과 문자열의 길이 - 1 사이의 정수값.
- 지정된 인덱스에 해당하는 유니코드 단일문자를 반환한다.
- 인자를 생략하면 기본값으로 0를 설정되고 첫 문자를 반환한다.
- 만약 인덱스가 문자열 길이보다 큰 경우 빈 문자열 (예) " " 을 반환한다.
- 문자열의 마지막 문자 순번은 stringName.length - 1 입니다.
var anyString = 'Brave new world';
console.log(anyString.charAt(0));
console.log(anyString.charAt()); // 비어있는 경우 0으로 인식
console.log(anyString.charAt(999)); // 길이를 벗어나면 빈 문자열을 반환
<배운걸로 적용해보기>
// map사용
function solution(x) {
return x
.split("") // 배열
.map((acc, i, arr) => (i < arr.length - 4 ? (acc = "*") : acc)) //map
.join("");
}
console.log(solution("01033334444"))
> split로 배열을 찢음 -> [ '0', '1', '0', '3', '3', '3', '3', '4', '4', '4', '4' ]
> .map( ) 사용, 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환
> 찢겨 생긴 이 배열(arr)인 [ '0', '1', '0', '3', '3', '3', '3', '4', '4', '4', '4' ]의 i번째의 요소를 --해서 acc에 모아 배열을 만듦
> 호출한 배열이 arr이고, 이 arr의 길이에서 -4한 값이 i보다 크다면? 참_acc는 *되고 : 거짓(해당되지않는다면)_ 변화없이 acc
> 뒤에서 4자리는 숫자, 그 앞은 모두 *로 표시하고자 함 그래서 전체의 길이인 length에서 뒤에서 4자리에 해당하는 4를 -해줌
> 인덱스 번호로 계산되는 i랑 길이로 계산되는 length랑 1자리 차이 나므로 =의 조건은 걸지 않음 만약 =이 들어가면 - 5가 되어야함
> join을 통해서 마지막으로 변형된 값의 배열을 문자열로 묶어줌
// charAt()
function solution(phone_number) {
var result = "";
for (var i = 0; i < phone_number.length; i++) {
result += i < phone_number.length - 4 ? "*" : phone_number.charAt(i);
}
return result;
}
console.log(solution("01033334444"))
> 마지막 삼항연산자를 살펴보면
> result에 값을 더해가는데 그 값은
> phone_number의 길이에서 -4를 한 값이 i보다 크면? 참(i가 작음)_*을 더해가고 : 거짓(i가 커지면)_i요소의 문자를 반환한다는 의미
> 이걸 for문을 통해 phone_number의 길이만큼 돌아가는 것
> 그래서 길이로는11, 인덱스로는10 까지의 범위에서 인덱스 i가 0~6까지 *로써 result에 저장되고 7,8,9,10까지는 숫자로 나타남
// 정규식
function hide_numbers(s){
return s.replace(/\d(?=\d{4})/g, "*");
}
정규 표현식 /d (?=\d{4}) /g
> \d : 하나의 숫자를 의미한다.
> (?=\d{4}) : 숫자의 뒤에 4개의 숫자가 있는지 검사하는 전방 탐색(lookahead)이다.(이를 통해 4개의 숫자 중 마지막 숫자만 제외하고 숨긴다.)
> g : 전역 검색을 수행하여 문자열 내의 모든 해당 패턴을 찾는다.
'✍️문제풀기✍️ > JS_Programmers school' 카테고리의 다른 글
프로그래머스(LV 1. 음양 더하기) (0) | 2023.06.21 |
---|---|
프로그래머스(LV 1. 수박수박수박수박수박수?) (0) | 2023.06.19 |
프로그래머스(LV 1. 서울에서 김서방 찾기) (0) | 2023.06.19 |
프로그래머스(LV 1. 문자열 다루기 기본) (0) | 2023.06.19 |
프로그래머스(LV 1. 문자열 내 p와 y의 개수) (0) | 2023.06.19 |