오전 내내 발표 스크립트 쓰고 시연영상 촬영하였음ㅠㅠ 정리하면서 작업한 내용에 대해 한 번씩 회고했다. 다른 조 발표도 보고... 몽고DB나 SQL로 저장한 조들도 있던데 대단해 보였다...
1) 어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.
//내가 짠 코드
let solution = (absolutes, signs) => {
let result = absolutes.map((x,index)=> x*(signs[index] ? 1 : -1));
return result.reduce((pre, cur)=>pre+cur)
}
//다른 사람 코드
function solution(absolutes, signs) {
return absolutes.reduce((acc, val, i) => acc + (val * (signs[i] ? 1 : -1)), 0);
}
나는 map()을 사용하여 absolutes의 값과 동일한 index의 signs의 값을 구해 양수인지 음수인지를 판별하였다.
reduce() 콜백의 세 번째 변수는 index이다.
reduce((acc, cur, idx)라고 함
다른 분의 풀이를 보면 이를 이용하여... 내가 작성한 코드와 동일한 원리로 signs에서 동일한 위치의 true/false값을 찾으신 듯. map을 쓰지 않고 reduce만 사용해서 풀 수 있구낭...
2) 전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 * 으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.
//내가 짠 코드
let solution = phone_number => {
return "*".repeat(phone_number.length-4)+phone_number.slice(-4,phone_number.length);
}
//다른 사람 코드
function hide_numbers(s){
return s.replace(/\d(?=\d{4})/g, "*");
}
난...전화번호의 길이에서 4를 뺀 만큼의 * 을 반복시켜 출력하고 이후에 폰넘버의 뒤에서 4자리를 문자열에 더해주었다...
그러나 마스킹... 정규식으로 굉장히 쉽게 할 수 있다... 그렇지만 정규식이 어렵다......................대체 저게 무슨 뜻인지 감도 안 온다. 챗지피티에게 도움을 요청했다...
\d: 숫자에 해당하는 문자를 찾는다.
\d는 digit(숫자)를 의미하는 정규식 표현임!!!
(?=\d{4}): 이 부분은 'lookahead assertion'입니다. 현재 위치에서 앞으로 4개의 연속된 숫자(\d{4})가 있는지 확인한다...
* 매칭이 이루어지려면 바로 뒤에 4개의 숫자가 더 있어야 함을 의미함
"Lookahead assertion"이란?
정규 표현식에서 특정 문자 또는 패턴 다음에 오는 문자 또는 패턴을 확인하는 데 사용되는 테크닉ㅠㅠ
실제로 문자열을 소비하지 않으면서(일치하는 부분을 결과로 포함하지 않으면서) 문자열에서 특정 패턴 뒤에 오는 내용을 검사
g: 전역 검색을 의미하는 플래그. 문자열 전체에 걸쳐서 모든 매칭되는 패턴을 찾음
작동 방식:
이 정규식은 문자열에서 매칭되는 모든 숫자를 찾아, 각 숫자가 바로 뒤에 4개의 숫자를 더 가지고 있는 경우에 해당 숫자를 * 로 대체함
Positive Lookahead ((?=패턴)): 포지티브. 이는 현재 위치에서 지정된 '패턴'이 이어져야만 일치한다고 판단... (==)
예를 들어, \d(?=\D)는 숫자(\d) 뒤에 비숫자 문자(\D)가 오는 경우에만 해당 숫자를 일치시킨다...
Negative Lookahead ((?!패턴)): 네거티브..! 이는 현재 위치에서 지정된 '패턴'이 이어지지 않아야만 일치한다고 판단 (!=)
예를 들어, \d(?!D)는 숫자 뒤에 비숫자 문자가 오지 않는 경우에만 해당 숫자를 일치시킴
Lookahead는 문자열 안에서 특정 조건을 만족하는 부분을 찾을 때 유용하지만, 실제로 그 부분을 결과에 포함시키지는 않음. 예를 들어, 이메일 주소에서 도메인 이름만을 추출하거나, 특정 단어 뒤에 오는 다른 단어를 찾는 등의 작업에 사용될 수 있다.
예시: /(\w+)(?=@)/는 이메일 주소에서 '@' 기호 앞에 있는 단어(사용자 이름)를 찾는다.
여기서 (\w+)는 단어를 찾고,
(?=@)는 해당 단어 뒤에 '@' 기호가 오는지 확인하는 positive lookahead.