코딩기록

string) 글자 지우기 / for...of + slice, for + includes, filter - 배열 값/ 인덱스에 해당하는 문자 제거 or 배열 값/ 인덱스에 해당하지 않는 문자로 새로운 문자열 생성 본문

프론트/JS)코딩테스트

string) 글자 지우기 / for...of + slice, for + includes, filter - 배열 값/ 인덱스에 해당하는 문자 제거 or 배열 값/ 인덱스에 해당하지 않는 문자로 새로운 문자열 생성

뽀짝코딩 2024. 8. 12. 00:49
728x90

문제 설명

문자열 str과 정수 배열 indices가 주어질 때, str에서 indices의 원소에 해당하는 인덱스의 글자를 지우고 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.


제한사항

  • 1 ≤ indices의 길이 < str의 길이 ≤ 100
  • str은 영소문자로만 이루어져 있습니다
  • 0 ≤ indices의 원소 < str의 길이
  • indices의 원소는 모두 서로 다릅니다.

입출력 예

 

str
indices
result
"apporoograpemmemprs"
1, 16, 6, 15, 0, 10, 11, 3]
"programmers"

 


입출력 예 설명

입출력 예 #1

  • 예제 1번의 str의 인덱스가 잘 보이도록 표를 만들면 다음과 같습니다.index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
    str a p p o r o o g r a p e m m e m p r s
    indices에 있는 인덱스의 글자들을 지우고 이어붙이면 "programmers"가 되므로 이를 return 합니다.
const solution = (str, indices) => {
  // do something
};

console.log(solution('apporoograpemmemprs', [1, 16, 6, 15, 0, 10, 11, 3])); // 'programmers'

 

 

 

 


풀이

1번 풀이 filter, includes 

특정 인덱스에 해당하지 않는 문자로 새롭게 문자열 생성.

  1. 문자열을 문자배열로 변경시 str.split('') 보다 [...str] 스프레드 문법이 더 간편하다.
  2. includes는 true / false 불린형으로 결과를 반환한다.
  3. str의 1, 16 ...인덱스가 true로 나오고 
  4. 그 결과가 join('')으로, 문자열로 붙여 반환된다.
// str문자열에 indices가 포함되지 않은 문자열만 반환.
const solution3 = (str, indices) => {
  // 특정 인덱스에 해당하지 않는 문자로 새롭게 문자열을 생성
 return [...str].filter((_, i) => !indices.includes(i)).join('');
};

console.log(solution3('apporoograpemmemprs', [1, 16, 6, 15, 0, 10, 11, 3])); // 'programmers'

 

 

 

2번 풀이 for, inlcudes

특정 인덱스에 해당하지 않는 문자로 새롭게 문자열 생성.

  1. for문의 i는 index인덱스라는 0,1,2,3 배열의 순서를 의미한다.
    • 인덱스 0 부터 str길이만큼 인덱스를 하나씩 추가하며 돈다.
  2. includes(i), str[i]의 i는  [1, 16 , 6, 15...] 이 배열안 요소(값)을 의미한다.
  3. str에  indices의 i는  1이라는 값이 포함되어 있지 않으면 res라는 식별자로 만든 빈문자열에 
  4. 문자를 하나하나 추가해서 p+r+o+.... 'programmers'라는 문자열을 만들어 반환한다.
const solution2 = (str, indices) => {
  let res = '';

  for (let i = 0; i < str.length; i++) {
    if (!indices.includes(i)) res += str[i];
  }

  return res;
};
console.log(solution2('apporoograpemmemprs', [1, 16, 6, 15, 0, 10, 11, 3])); // 'programmers'

 

 

3번 풀이 for...of, slice

특정 인덱스의 문자를 제거

  1.  indices 배열을 내림차순으로 정렬하면 16,  15, 11, 10 ... 큰 숫자부터 앞으로 온다.
  2.  for...of의 i는 indices 배열의 각 요소를, 즉 indices 배열의 각 값을 차례대로 가져온다. 
  3.  slice(0,i)는 0부터 i번째 인덱스 전까지의 값을 가져온다(i미포함).
    • slice(0, 1) 이면 1의앞인 인덱스0을 가져온다.
  4. slice(i + 1)은 i + 1번째 인덱스부터 끝까지의 값을 가져온다.  
    • slice(2)면  인덱스2 부터 끝까지인 'poroograpemmemprs' 값을 가져온다.
  5. 가져온 두 값을 합해 str에 담아 반환한다.

 

// 특정 인덱스의 문자를 제거
const solution1 = (str, indices) => {
  // indices 배열을 내림차순으로 정렬
  indices.sort((a, b) => b - a);

  // 각 인덱스에 해당하는 문자를 순차적으로 제거
  for (const i of indices) {
    // console.log(1111, str.slice(i + 1));
    str = str.slice(0, i) + str.slice(i + 1);
  }
  return str;
};
console.log(solution1('apporoograpemmemprs', [1, 16, 6, 15, 0, 10, 11, 3])); //  "programmers"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
Comments