코딩테스트/프로그래머스 기초 트레이닝

[Javascript] 세로 읽기

dev_swH 2023. 6. 27. 16:19

문제 설명 : 

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

 

문자열을 배열로 만들어서 나눠야겠다

➡ 배열을 갯수만큼 자르는 법 이래저래 검색해서 코드 짬

(하다 보니 코드가 너무 길어져서 그냥 비권장이어도 아직 유효한 메소드인데 substr 쓰는 게 낫지 않나? 라는 생각이 살짝 들었으나 일단 함)

➡ 나눈 배열을 forEach로 반복 돌려서 빈 문자열에 붙임

➡ 마지막 배열 길이가 모자랄 경우 undefined가 붙길래 조건연산자 추가

 

그렇게 해서 작성한 코드.....

function solution(my_string, m, c) {
    const str_arr = [...my_string];
    const divide = Math.ceil(str_arr.length / m);
    const arr_list = [];
    let answer = ""

    for (i = 0; i <= divide; i++) {
        arr_list.push(str_arr.splice(0, m));
    }

    arr_list.forEach((el) => {
        el[c-1] ? answer += el[c-1] : answer;
    })

    return answer;
}

 

그런데......

다른 사람들 너무 간단하게 했더라!!!!!

(match와 정규식으로 배열 자르는 방법을 사용하고 싶었는데 공식문서와 외국 튜토리얼은 내가 필요로 하는 부분만 찾기가 힘들고 이해해서 응용하기까지 너무 오래 걸린다.....한국인이 쓴 정규식표현 책을 무조건 한 권은 사야겠다....)

function solution(my_string, m, c) {
    return [...my_string].filter((_, i) => i % m === c - 1).join('');
}
function solution(my_string, m, c) {
    return Array.from(my_string).reduce((word, v, i) => {
        return i % m + 1 === c ? word + v : word
    }, '')
}

 

배열을 나누지 않고 인덱스만 골라내는 방법을 아예 생각하지 못했어서 머리를 한 대 맞은 기분이었다.

문제 설명에게 속은 기분!!

 

function solution(my_string, m, c) {
    let answer ="";
    for(let i = c-1; i < my_string.length ; i+=m) answer+=my_string[i];
    return answer;
}
function solution(my_string, m, c) {
    var answer = '';

    for(let i = 0; i < my_string.length; i += m) {
        answer += my_string[i + c - 1]
    }
    return answer;
}

 

배열로 만들지도 않고 문자열에 반복문을 사용한 코드도 있었다.

이것도 영리한 방법이라는 생각이 들었다.

오늘도 많은 분들께 배워갑니다......😌

시간 날 때 다시 코드 보면서 내 걸로 만들어야지.