[js] 세로 읽기 (lv.0, 정답률 87%)

sookyoung.k·2024년 4월 16일
0
post-thumbnail

문자열 my_string과 두 정수 m, c가 주어집니다. my_string을 한 줄에 m 글자씩 가로로 적었을 때 왼쪽부터 세로로 c번째 열에 적힌 글자들을 문자열로 return 하는 solution 함수를 작성해 주세요.

제한사항

  • my_string은 영소문자로 이루어져 있습니다.
  • 1 ≤ m ≤ my_string의 길이 ≤ 1,000
  • m은 my_string 길이의 약수로만 주어집니다.
  • 1 ≤ c ≤ m

😂 나의 풀이

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 완성!

😎 다른 풀이 1

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()

  • 필터링 된 문자열을 하나로 합침

🤑 다른 풀이 2

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번째 문자열을 추출

🤭 다른 풀이 3

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 조건을 통해 필터링을 한 후 누적된 새로운 문자열을 생성해 반환한다
profile
영차영차 😎

0개의 댓글