문자열 my_string과 두 정수 m, c가 주어집니다. my_string을 한 줄에 m 글자씩 가로로 적었을 때 왼쪽부터 세로로 c번째 열에 적힌 글자들을 문자열로 return 하는 solution 함수를 작성해 주세요.
제한사항
function solution(my_string, m, c) {
let arr = [];
let answer = '';
for (let i=0; i<my_string.length; i+=m) {
arr.push(my_string.substring(i, i+m));
}
for (let j = 0; j < arr.length; j++) {
answer += arr[j].charAt(c - 1);
}
return answer;
}
사실 for문 마지막 조건을 어떻게 줘야 할지 모르겠어서 좀 헤맸다. for문 안의 변수을 초기값 0으로 시작하고 나서 그 다음은...? 세 번째 조건을 어떻게 줘야할지 고민하다가...
친구
에게 물어봄 ㅎ
for문에서 i를 0부터 시작한 다음 문자열이 끝날 때까지 m만큼 증가시키면서 반복하면 된다. m이 4라면 5번째 인덱스로 슝~ 이동하면 되는 것임.
그리고 반복문에서 my_string.substring(i, i+m)
, i번째 인덱스부터 i+m번째 인덱스 전까지의 부분 문자열을 추출한 후 arr
에 넣어준다. 그러면 m만큼 쪼갠 my_string
배열이 만들어진다.
한 번 더 for문을 돌려서... 각 인덱스의 문자열에서 c번째의 문자열을 charAt()
을 통해서 추출하여 합쳐준다. 그렇게 answer
완성!
function solution(my_string, m, c) {
return [...my_string].filter((_, i) => i % m === c - 1).join('');
}
filter()
_
는 현재 요소를 사용하지 않음i
는 현재 요소의 인덱스i % m === c - 1
= 인덱스가 m의 배수이면서 c번째 요소들을 필터링join()
const solution=(s,m,c)=>s.match(new RegExp(`.{${m}}`,'g')).map(v=>v[c-1]).join('');
s.match(new RegExp(.{${m}},'g'))
→ 입력 문자열을 정규표현식을 사용하여 일정한 간격으로 분할한다! .{${m}}
는 m개의 문자를 의미하는 것, 'g'
는 전역 검색map()
map(v=>v[c-1])
= 각 분할된 문자열에서 c번째 문자열을 추출function solution(my_string, m, c) {
return Array.from(my_string).reduce((word, v, i) => {
return i % m + 1 === c ? word + v : word
}, '')
}
Array.from()
reduce()
word
는 누적된 문자열, v
는 현재 요소의 값, i
는 현재 요소의 인덱스i % m + 1 === c
조건을 통해 필터링을 한 후 누적된 새로운 문자열을 생성해 반환한다