본문으로 건너뛰기
/ Docs

문자열 트레이닝 (Day 17-18)

[프로그래머스] 일일 도전 과제 문제 풀이 정리입니다.
관련 개념도 첨부하였으니 필요한 분들은 참고하세요.
코딩 기초 트레이닝, 코딩테스트 입문 문제를 Day별로 풀고 정리한 내용입니다.

🌞

✨Day 17-18

오늘도 문자열 관련 예제들이 많습니다

목표: 문자열 치환하기 & 정규식 익히기

  • 배열 순회
    reduce ✨ 하나의 누적된 값
    filter ✨ 조건을 통과한 요소만 새 배열 생성
  • 구조분해할당

알아야 할 메서드

  • 탐색/확인
    includes 🔍 배열에 값 존재 여부 확인
    lastIndexOf 🔍 찾으려는 문자열의 마지막 인덱스 반환
    match() 🔍 문자열이 몇 번 등장하는지 세기
  • 문자열 치환/변환
    replaceAll 🔄 문자열에서 모든 특정 패턴 치환
  • 정규식
    /zero|one|two|.../g : OR 패턴, 전역 치환
    new RegExp(str,'g') : 문자열 동적 패턴

입문

숫자 찾기

function solution(num, k) {
return (num+"").indexOf(k)+1 || -1
}

🍞 (num+"") Number -> String


n의 배수 고르기

function solution(n, numlist) {
return numlist.filter((v)=> !(v%n))
}

🍞 filter


자릿수 더하기

function solution(n) {
return [...(n+"")].reduce((acc,cur)=> acc + Number(cur), 0)
}
function solution(n) {
return n
.toString()
.split("")
.reduce((acc, cur) => acc + Number(cur), 0);
}

OX퀴즈

function solution(quiz) {
return quiz.map((v)=> {
const [form,result] = v.split('=');
const [a, op, b] = form.split(' ');
const sum = op === '+' ? Number(a) + Number(b) : Number(a) - Number(b);
return sum === Number(result) ? 'O' : 'X'
})
}

🍞 구조분해할당


문자열안에 문자열

function solution(str1, str2) {
return str1.includes(str2) ? 1 : 2
}

🍞 includes

function solution(str1, str2) {
return str1.split(str2).length > 1 ? 1 : 2
}

🍞 split의 다른 쓰임새


제곱수 판별하기

function solution(n) {
let i = 1;
while(i*i<=n){
if(i*i===n) return 1;
i++;
}
return 2;
}
function solution(n) {
return Number.isInteger(Math.sqrt(n)) ? 1 : 2;
}

🍞 sqrt로 제곱근 구하고 isInteger 정수인지 확인


세균 증식

function solution(n, t) {
for(let i=0;i<t;i++){
n *= 2
}
return n
}
function solution(n, t) {
return n << t;
}

🍞 시프트연산 n<<tn*2^t


문자열 정렬하기 (2)

function solution(my_string) {
return [...my_string.toLowerCase()].sort().join('')
}

기초

특정 문자열로 끝나는 가장 긴 부분 문자열 찾기

function solution(myString, pat) {
return myString.slice(0,myString.lastIndexOf(pat)+pat.length)
}

문자열이 몇 번 등장하는지 세기

function solution(myString, pat) {
return [...myString].filter((_,idx)=>myString.slice(idx,idx+pat.length)
.includes(pat)).length
}
function solution(myString, pat) {
const reg = new RegExp(`(?=${pat})`, "g")
return myString.match(reg)?.length || 0;
}

🍞 정규식


ad 제거하기

function solution(strArr) {
return strArr.filter((v)=> !v.includes('ad'))
}

공백으로 구분하기 2

function solution(my_string) {
return my_string.split(' ').filter((v) => v!=='')
}

🍞 filter(v=>v)도 됨 : JS에서 ""는 falsy 값이기 때문


x 사이의 개수

function solution(myString) {
return myString.split('x').map((v)=>v.length)
}

간단한 식 계산하기

function solution(binomial) {
const [a, op, b] = binomial.split(' ')
switch (op){
case '+':
return Number(a) + Number(b);
case '-':
return Number(a) - Number(b);
case '*':
return Number(a) * Number(b)
}
}

🍞 구조분해할당

const ops = {
'+': (a, b) => a + b,
'-': (a, b) => a - b,
'*': (a, b) => a * b,
};

function solution(binomial) {
const [a, op, b] = binomial.split(' ');
return ops[op](+a, +b);
}

🍞 객체


rny_string

function solution(rny_string) {
return [...rny_string].map((v)=> v==='m'?'rn':v).join('')
}
function solution(rny_string) {
return rny_string.replaceAll(/m/g, "rn");
}

🍞 정규식