코딩기록

string) 중복된 문자 제거 / 공백포함 문자열 중복 제거 set, filter, reduce, for, for...of 본문

프론트/JS)코딩테스트

string) 중복된 문자 제거 / 공백포함 문자열 중복 제거 set, filter, reduce, for, for...of

뽀짝코딩 2024. 9. 23. 23:19
728x90

문제 설명

문자열 str이 매개변수로 주어집니다. str에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ str ≤ 110
  • str은 대문자, 소문자, 공백으로 구성되어 있습니다.
  • 대문자와 소문자를 구분합니다.
  • 공백(" ")도 하나의 문자로 구분합니다.
  • 중복된 문자 중 가장 앞에 있는 문자를 남깁니다.

입출력 예

str result

"people" "peol"
"We are the world" "We arthwold"

입출력 예 설명

입출력 예 #1

  • "people"에서 중복된 문자 "p"와 "e"을 제거한 "peol"을 return합니다.

입출력 예 #2

  • "We are the world"에서 중복된 문자 "e", " ", "r" 들을 제거한 "We arthwold"을 return합니다.
/**
 * @param {string} str
 * @return {string}
 */
const solution = str => {
  // do something
};

console.log(solution('people')); // 'peol'
console.log(solution('We are the world')); // 'We arthwold'

 


 

풀이

총 5가지 방법 set, filter, reduce, for, for...of  

 

1번 풀이 set

set은 배열에서 중복된 요소를 제거한다.

const solution1 = str => [...new Set(str)].join('');
console.log(solution1);

console.log(solution1('people')); // 'peol'
console.log(solution1('We are the world')); // 'We arthwold'

 

 

2번 풀이 filter

filter는 참인것만 반환하는데, i인덱스가 문자열에서 현재 문자가 처음으로 등장하는 것만 반환한다.

'people'에서 인덱스[3] 'p'는 인덱스[0]과 같지 않으므로 걸러진 것.

str.indexOf(str[i]) // str[i]- 인덱스

// 2번 풀이 - filter
const solution2 = str => {
  return [...str].filter((c, i) => {
    return str.indexOf(c) === i
  }).join('');

  // console.log(str.indexOf(c)); // c-문자열 요소
  //문자열에서 현재 문자가 처음으로 등장하는 위치(인덱스)를 반환
  // console.log(str.indexOf(str[i]));  // str[i]-인덱스
};
console.log(solution2('people')); // 'peol'
console.log(solution2('We are the world')); // 'We arthwold'

 

3번 풀이 reduce

reduce는 꼭 초기값 설정을 하는것이 속 편하다. 자꾸 이것 때문에 오류가 난다.

  1. 초기 값을 ' ' 빈문자열로 설정한 후,
  2. acc라는 누적값에 cur이라는 현재값이 포함되어 있지 않은것만 참이되어 if문으로 진입.
  3. acc에 문자를 하나씩 더한다.  
// 3번 풀이 - reduce  // reduce사용시 초기값 설정 잊지 말것!!!
const solution3 = str => {
  return [...str].reduce((acc, cur) => {
    if (!acc.includes(cur)) {
      acc += cur;
    }
    return acc;
  }, '');
};
console.log(solution3('people')); // 'peol'
console.log(solution3('We are the world')); // 'We arthwold'

 

 

4번 풀이 for문, 문자와 인덱스가 동일한지 확인

  1. for문으로 배열의 길이만큼 반복적으로 요소를 돌면서,
  2. if문의 조건이 참일 경우 해당 인덱스에 속하는 문자가,
  3. res라는 빈배열에 하나씩 더해진다.

'p'라는 값이 같아도  인덱스가 [0]과 [3]으로 다르기 때문에 중복이 걸러진다.

// 4번 풀이 - for
const solution4 = str => {
  let res = '';
  for (let i = 0; i < str.length; i++) {
    // indexOf는 인수로 전달받은 문자열을 검색하여 첫번째 인덱스를 반환한다. 검색에 실패하면 -1을 반환한다.
    if (str.indexOf(str[i]) === i) res += str[i];
  }
  return res;
}
console.log(solution4('people')); // 'peol'
console.log(solution4('We are the world')); // 'We arthwold'

 

 

5번 풀이 for..of문, 문자와 인덱스가 동일한지 확인

  1. for..of를 이용해 res문자열에 배열 요소인c가 없으면
  2. res라는 빈배열에 배열 요소인 문자가 하나씩 더해진다.

1번째

res: ' ' 빈문자열  /   요소c  'p'  /   저장 res: 'p'  

2번째

res: 'p'  /  요소c  'e'  /   저장 res: 'pe'  

3번째

res: 'pe'  /  요소c  'o'  /   저장 res: 'peo'  

4번째

res: 'peo'  /  요소c  'p' ❌중복요소라 저장 안됨❌ /   저장 res: 'peo'  

5번째

res: 'peo'  /  요소c  'l'  /   저장 res: 'peol'  

6번째

res: 'peol'  /  요소c  'e' ❌중복요소라 저장 안됨❌   /   저장 res: 'peol'  

결과  'peol'

// 5번 풀이 - for...of
const solution5 = str => {
  let res = '';
  for (const c of str) {
    if (!res.includes(c)) res += c;
  }
  return res;
}
console.log(solution5('people')); // 'peol'
console.log(solution5('We are the world')); // 'We arthwold'

 

 

 

 

참고

나, 쳇지피티

반응형
Comments