코딩기록

replace) 모음제거 / 문자열에서 특정 문자(2개이상) 제거 - for, forEach(배열), for...of(문자열), reduce, 정규표현식+replace(변수명, ' '), includes 본문

프론트/JS)코딩테스트

replace) 모음제거 / 문자열에서 특정 문자(2개이상) 제거 - for, forEach(배열), for...of(문자열), reduce, 정규표현식+replace(변수명, ' '), includes

뽀짝코딩 2024. 9. 25. 21:25
728x90

문제 설명

영어에선 a, e, i, o, u 다섯 가지 알파벳을 모음으로 분류합니다. 문자열 str이 매개변수로 주어질 때 모음을 제거한 문자열을 return하도록 solution 함수를 완성해주세요.


제한사항

  • str은 소문자와 공백으로 이루어져 있습니다.
  • 1 ≤ str의 길이 ≤ 1,000

입출력 예

str result

"bus" "bs"
"nice to meet you" "nc t mt y"

입출력 예 설명

입출력 예 #1

  • "bus"에서 모음 u를 제거한 "bs"를 return합니다.

입출력 예 #1

  • "nice to meet you"에서 모음 i, o, e, u를 모두 제거한 "nc t mt y"를 return합니다.
const solution = str => {
  // do something
};

console.log(solution('bus')); // 'bs'
console.log(solution('nice to meet you')); // 'nc t mt y'

 

 

 


풀이

1번 풀이 for문

먼저 aeiou 모음 문자열 식별자를 만든다.

그리고 포문을 돌면서 식별자에 str인덱스가 includes되어있는지 확인하고 

있으면 src라는 빈문자열에 하나씩 더한다.

// 1번 풀이 for
const solution1 = str => {
  const target = 'aeiou';
  let src = '';
  for (let i = 0; i < str.length; i++) {
    if (!target.includes(str[i])) src += str[i];
    // !target.includes(str[i]) ? src += str[i] : null
  };
  return src;
};
console.log(solution1('bus')); // 'bs'
console.log(solution1('nice to meet you')); // 'nc t mt y'

 

 

2번 풀이 forEach

forEach는 배열을 순회한다. 문자열을 순회하는 for...of와 헷갈리지 않게 주의❗❗

배열을 순회하고 str 요소c를 target이 includes했는지 if 조건문으로 보고 참일때

src빈 문자열에 요소c를 하나씩 더한다.

// 2번 풀이 forEach
const solution2 = str => {
  const target = 'aeiou';
  let src = '';
  [...str].forEach(c => {
    if (!target.includes(c)) src += c;
  });
  return src;
};
console.log(solution2('bus')); // 'bs'
console.log(solution2('nice to meet you')); // 'nc t mt y'

 

3번 풀이 for...of

for...of로 순회할때도 forEach처럼 요소(값)를 쓴다. for는 [인덱스]를 사용하는 것과 차이가 있다.

코드의 내용은 위 for,  forEach와 동일하다

// 3번 풀이 for...of
const solution3 = str => {
  const vowels = 'aeiou';
  let result = '';
  for (const c of str) {
    if (!vowels.includes(c)) result += c;
  }
  return result;
};
console.log(solution3('bus')); // 'bs'
console.log(solution3('nice to meet you')); // 'nc t mt y'

 

4번 풀이 정규표현식 .replace(변수명, ' ');

정규표현식과 replace를 사용했다.

  • repExp로 식별자를 만들고   
    • / : 시작  
    • /g : 전역으로 검색
    • [aeiou] : 제거해야할 모음
    • // 두 코드의 결과는 동일.
      const re = /\w+\s/g;

      // 생성자를 이용함.
      const re = new RegExp("\\w+\\s", "g");

replace를 이용해 첫번째 인자에 제거할 정규식을 적고, 두번째 인자에 대체할 값을 적는다. 

여기선 빈 문자열' '을 적었다. 

// 4번 풀이 정규표현식-replace(변수명, '');
const solution4 = str => {
  const regExp = /[aeiou]/g;
  return str.replace(regExp, '');
};
console.log(solution4('bus')); // 'bs'
console.log(solution4('nice to meet you')); // 'nc t mt y'

 

5번 풀이 reduce

모음을 제외한 문자 누적.

reduce는 너무 헤매서 쳇지피티의 도움을 받았다. 코드 흐름은 나중에 필요할때 참고해야지.

// 5번 풀이 reduce -모음을 제외한 문자 누적.
const solution5 = str => {
  const vowels = 'aeiou';
  return [...str].reduce((acc, cur) => vowels.includes(cur) ? acc : acc + cur, '');
};
console.log(solution5('bus')); // 'bs'
console.log(solution5('nice to meet you')); // 'nc t mt y'
  • vowels.includes(cur)로 현재 문자(cur)가 모음인지 확인합니다.
  • 모음일 경우: 누적된 값 acc는 그대로 반환되어 갱신되지 않습니다. 즉, 모음은 누적값에 더하지 않고 건너뜁니다.
  • 모음이 아닐 경우: acc + cur로 현재 문자를 누적값에 더합니다. 이때 누적된 문자열에 자음이 추가됩니다.

예시 흐름:

  • str = 'bus'의 경우:
    1. 첫 번째 문자 b: 모음이 아니므로 acc + 'b' → acc = 'b'
    2. 두 번째 문자 u: 모음이므로 acc는 그대로 → acc = 'b'
    3. 세 번째 문자 s: 모음이 아니므로 acc + 's' → acc = 'bs' 최종 결과는 'bs'.
  • str = 'nice to meet you'의 경우:
    1. 첫 번째 문자 n: 자음이므로 acc + 'n' → acc = 'n'
    2. 두 번째 문자 i: 모음이므로 acc 그대로 → acc = 'n'
    3. 세 번째 문자 c: 자음이므로 acc + 'c' → acc = 'nc'
    4. 네 번째 문자 e: 모음이므로 acc 그대로 → acc = 'nc'
    5. 다섯 번째 문자 ' ': 공백이므로 acc + ' ' → acc = 'nc ' ... 최종적으로 'nc t mt y'가 반환됩니다.

reduce()의 두 번째 인자 (초기값)

  • reduce()의 두 번째 인자로 빈 문자열 ''을 전달했습니다.
  • 이 초기값은 누적값 acc의 초기 상태를 의미합니다. 즉, 처음에는 빈 문자열에서 시작하고, 자음이나 공백을 만나면 그때그때 문자를 더해 나갑니다.

요약:

  1. 문자열을 배열로 변환합니다.
  2. 배열의 각 문자를 순회하면서 모음은 건너뛰고, 자음이나 공백을 누적합니다.
  3. 누적된 문자열을 반환하여 최종 결과로 반환합니다.

 

6번 풀이 filter

// 6번 풀이 filter
const solution6 = str => {
  const vowels = 'aeiou';
  return [...str].filter((c) => !vowels.includes(c)).join('');
};
console.log(solution6('bus')); // 'bs'
console.log(solution6('nice to meet you')); // 'nc t mt y'

 

 

 

 

 

 

 

 

 

 

참고

나, 쳇지피티

 

반응형
Comments