replace와 정규식 (Day 15-16)
[프로그래머스] 일일 도전 과제 문제 풀이 정리입니다.
관련 개념도 첨부하였으니 필요한 분들은 참고하세요.
코딩 기초 트레이닝, 코딩테스트 입문 문제를 Day별로 풀고 정리한 내용입니다.
🌞
✨Day 15-16
오늘은 문자열 관련 예제들이 많습니다
목표: 문자열 치환하기
- 배열 순회
reduce✨ 하나의 누적된 값
filter✨ 조건을 통과한 요소만 새 배열 생성 - 구조분해할당과 변수 스왑
[a,b] = [b,a]: swap
알아야 할 메서드
- 배열 탐색/확인
includes🔍 배열에 값 존재 여부 확인 - 문자열 치환/변환
replace🔄 문자열에서 첫번째 특정 패턴 치환
replaceAll🔄 문자열에서 모든 특정 패턴 치환 - 정규식
/zero|one|two|.../g: OR 패턴, 전역 치환
new RegExp(str,'g'): 문자열 동적 패턴
입문
영어가싫어요
객체키 값으로 대응하는 게 있으면 객체 사용new RegExp(op, 'g')문자열에서 op 단어를 전역(g)으로 찾는 정규식 생성replace찾은 패턴을 치환
function solution(numbers) {
const ops = {
one : 1,
two : 2,
three : 3,
four : 4,
five : 5,
six : 6,
seven : 7,
eight : 8,
nine : 9,
zero : 0
}
for (const op in ops) {
const str = new RegExp(op, 'g');
numbers = numbers.replace(str, ops[op]);
}
return Number(numbers)
}
💡개선코드
replace이렇게 쓰는거구나- 정규식에도 or 들어갈 수 있음
function solution(numbers) {
const obj = {
zero: 0, one: 1, two: 2, three: 3, four: 4,
five: 5, six: 6, seven: 7, eight: 8, nine: 9
};
const num = numbers
.replace(/zero|one|two|three|four|five|six|seven|eight|nine/g, (v) => {
return obj[v];
});
return Number(num);
}
인덱스 바꾸기
구조분해할당배열이나 객체를 구조 분해해서 한 번에 변수에 대입할 수 있음 -> swap 안해도됨
function solution(my_string, num1, num2) {
const strArr = [...my_string];
[strArr[num1], strArr[num2]] = [strArr[num2], strArr[num1]]
return strArr.join('')
}
💡추가코드
[...str]최신코드split('')특정 구분자로 나눌때
function solution(my_string, num1, num2) {
my_string = my_string.split('');
[my_string[num1], my_string[num2]] = [my_string[num2], my_string[num1]];
return my_string.join('');
}
한 번만 등장한 문자
function solution(s) {
return [...s].filter((v,idx)=> s.lastIndexOf(v)===s.indexOf(v)).sort().join('')
}
약수 구하기
Array.from(arrayLike, mapFn)유사 배열 객체(문자열 등)를 새로운 배열로 만들어줌Array.from(arrayLike, mapFn)arrayLike 배열로 변환할 객체, mapFn 호출할 함수
function solution(n) {
return Array.from(Array(n), (_,idx)=> idx+1).filter((v)=> n%v===0)
}
💡추가코드
function solution(n) {
return Array(n).fill(0).map((v, index) => v+index+1).filter((v) => n%v===0);
}
문자열 계산하기
function solution(my_string) {
let sum = 0;
my_string.split(' ').map((v)=> isNaN(v)?v:Number(v))
.forEach((v,idx,arr)=>{
if(idx===0) sum += v;
if(v==='+') sum += arr[idx+1];
if(v==='-') sum -= arr[idx+1];
})
return sum
}