본문으로 건너뛰기
/ Docs

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
}

배열의 유사도

function solution(s1, s2) {
return s1.filter((v,idx)=> s2.indexOf(v)!==-1).length
}

💡개선코드

  • includes 배열에 포함된 항목 찾기
function solution(s1, s2) {
const intersection = s1.filter((x) => s2.includes(x));
return intersection.length;
}

기초

조건에 맞게 수열 변환하기1

function solution(arr) {
return arr.map((v)=> {
if(v>=50 && v%2===0) return v/2;
else if(v<50 && v%2!==0) return v*2;
else return v;
})
}

조건에 맞게 수열 변환하기2

  • map을 사용하여 요소마다 계산을 돌림
function solution(arr) {
return Math.max(...arr.map((v)=>{
let i = 0;
while((v>=50&&v%2===0)||(v<50&&v%2!==0)){
v%2 ? v=v*2+1 : v=v/2;
i++;
}
return i++;
}))
}

💡개선코드 런타임에러

  • 배열이 클 경우 런타임 에러가 발생하기때문에 배열 전체를 탐색해서 바뀌었는지 확인하는 방법으로 변경
function solution(arr) {
let change = true, count = 0;

while (change) {
change = false;
for (let i = 0; i < arr.length; i++) {
let v = arr[i];
if ((v>=50 && v%2===0) || (v<50 && v%2!==0)) {
arr[i] = v%2 ? v*2+1 : v/2;
change = true;
}
}
if(change) count++;
}
return count
}

1로 만들기

합산 값은 reduce

function solution(num_list) {
return num_list.reduce((acc,cur)=> {
let i = 0;
while(cur>1){
cur%2 ? cur=(cur-1)/2 : cur = cur/2
i++;
}
return acc + i
}, 0)
}

길이에 따른 연산

합산 값은 reduce

function solution(num_list) {
return num_list.length<11 ? num_list
.reduce((acc,cur)=> acc * cur) : num_list.reduce((acc,cur)=> acc + cur);
}

💡개선코드

  • reduce 이렇게도 쓸 수 있구나
const solution(num_list) {
return num_list.reduce((a,v)=>num_list.length>10?a+v:a*v)
}

원하는 문자열 찾기

function solution(myString, pat) {
return myString.toUpperCase().includes(pat.toUpperCase())? 1 : 0;
}

💡팁

+만 붙이면 Boolean을 숫자로 변환함 (true는 1 false 는 0으로)

+(s.toLowerCase().includes(p.toLowerCase()))

배열에서 문자열 대소문자 변환

function solution(strArr) {
return strArr.map((v,idx)=> idx%2 ? v.toUpperCase() : v.toLowerCase())
}

A강조하기

function solution(myString) {
return [...myString].map((v)=>v==='a'? 'A' : v==='A'? v: v.toLowerCase()
).join('')
}

💡개선코드

  • 다 소문자로 바꾼다음 aA
const solution=s=>s.toLowerCase().replaceAll('a','A');

특정한 문자를 대문자로 바꾸기

function solution(my_string, alp) {
return [...my_string].map((v)=> v===alp?v.toUpperCase() : v).join('')
}

💡개선코드

  • 특정문자특정문자의 대문자
const solution=(s,a)=>s.replaceAll(a,a.toUpperCase())