코딩기록

string) 글자 이어 붙여 문자열 만들기 / map-인자.하나일땐 배열 요소, reduec-인자.두개일땐, 누적값과 배열요소. / 배열 중복 값 제거 본문

프론트/JS)코딩테스트

string) 글자 이어 붙여 문자열 만들기 / map-인자.하나일땐 배열 요소, reduec-인자.두개일땐, 누적값과 배열요소. / 배열 중복 값 제거

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

문제 설명

문자열 str과 정수 배열 indices가 매개변수로 주어집니다. str의 indices의 원소들에 해당하는 인덱스의 글자들을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.


제한사항

  • 1 ≤ str의 길이 ≤ 1,000
  • str의 원소는 영소문자로 이루어져 있습니다.
  • 1 ≤ indices의 길이 ≤ 1,000
  • 0 ≤ indices의 원소 < str의 길이

입출력 예

 

str
indices
result
"cvsgiorszzzmrpaqpe"
[16, 6, 5, 3, 12, 14, 11, 11, 17, 12, 7]
"programmers"
"zpiaz"
[1, 2, 0, 0, 3]
"pizza"

 


입출력 예 설명

  • 입출력 예 #1
    • 예제 1번의 str에서 인덱스 3, 5, 6, 11, 12, 14, 16, 17에 해당하는 글자는 각각 g, o, r, m, r, a, p, e이므로 str에서 indices에 들어있는 원소에 해당하는 인덱스의 글자들은 각각 순서대로 p, r, o, g, r, a, m, m, e, r, s입니다. 따라서 "programmers"를 return 합니다.
    입출력 예 #2
    • 예제 2번의 str에서 인덱스 0, 1, 2, 3에 해당하는 글자는 각각 z, p, i, a이므로 str에서 indices에 들어있는 원소에 해당하는 인덱스의 글자들은 각각 순서대로 p, i, z, z, a입니다. 따라서 "pizza"를 return 합니다.

 

const solution = (str, indices) => {
  // do something
};

console.log(solution('cvsgiorszzzmrpaqpe', [16, 6, 5, 3, 12, 14, 11, 11, 17, 12, 7]));
// 'programmers'
console.log(solution('zpiaz', [1, 2, 0, 0, 3]));
// 'pizza'

 

 

 


풀이

1번 풀이 - map() 

  1. str 문자열에서 indices 배열에 있는 숫자에 해당하는 인덱스의 글자를 map()으로 순서대로 추출.
  2. join()으로 이어 붙여 문자열로 만들어 반환.

 

📣이 문제에서 가장 헷갈렸던 부분인 str의 인덱스와 indices의 인덱스였다.

무슨 말이냐면 indices의 값 16 ,6, 5에 해당하는 인덱스를 str에서 찾는 것인데 여기서부터 인덱스의  시작되었다.

아래 예시 1) 코드에서 첫 번째 인자  이름으로 적힌 i는 통상적으로 index를 의미한다.

첫번쨰 인자를 value가 아니라 index로, 즉 indices라는 배열의 인덱스로 착각한것이다.

예시1)
indices.map(i => str[i]).join('');

인자가 하나만 있으면 값인데❗❗ 16 ,6 ,5 라는 값이지 인덱스 [0], [1], [2]가 아닌데❗❗❗

이래서 이름을 잘 지어야 한다😂😂

 

✅✅정리하자면, map()에서 인자가 하나면 value (배열을 순회하는 값 하나하나. 여기서는 16, 6, 5, 3, 12... )를 의미하고,

str[ ]는 str의 인덱스를 뜻한다. str[indices에서 찾은 값]에 해당하는 인덱스. 즉, str[16]  => ' p '를 의미한다.

 

풀이)
const solution = (str, indices) => {
  return indices.map(num => str[num]).join('');
};

console.log(solution('cvsgiorszzzmrpaqpe', [16, 6, 5, 3, 12, 14, 11, 11, 17, 12, 7]));
// 'programmers'
console.log(solution('zpiaz', [1, 2, 0, 0, 3]));
// 'pizza'

 

 

2번 풀이 - reduce() 

  • 초기값을  ' ' 빈문자열로 시작하고, num은 배열을 순회하는 요소(16, 6, 5, 3...). 
  • indices배열을 순회하면서  str문자열에 인덱스에 해당하는 문자를 누적. 
  • acc는 누적된 문자열, str[num]은 현재 순회중인 num에 해당하는 str문자.

 str[16]  => ' p '  str[6] => ' r '   ...  

acc에 누적되서 최종적으로 programmers 라는 문자열이 완성된다.

 

// 2번 풀이 - reduce
const solution2 = (str, indices) => {
  return indices.reduce((acc, num) => acc + str[num], '');
  

};
console.log(solution2('cvsgiorszzzmrpaqpe', [16, 6, 5, 3, 12, 14, 11, 11, 17, 12, 7]));
// 'programmers'
console.log(solution2('zpiaz', [1, 2, 0, 0, 3]));
// 'pizza'

--------------------------------------------------------------
// reduce 삼항연산자 풀이법 
const solution2 = (str, indices) => {
  						// acc는 배열에 cur이 있으면 acc반환								
   indices.reduce((acc, cur) => acc.includes(cur) ? acc : [...acc, cur], []); 
  						// 없으면 cur를 포함하여 배열 리턴.
};
console.log(solution2('cvsgiorszzzmrpaqpe', [16, 6, 5, 3, 12, 14, 11, 11, 17, 12, 7]));
// 'programmers'
console.log(solution2('zpiaz', [1, 2, 0, 0, 3]));
// 'pizza'

 

 

✨✨reduce()에서도 인자가 두개일때 첫번째는 누적, 두번째는 배열을 순회하는 요소라는 걸 잊지 말자❗❗❗ 배열의 인덱스가 아니다❌❌❌

 

 

참고 

나, 쳇지피티

 

 

반응형
Comments