[프로그래머스 | JS] Lv0. 부분 문자열 이어 붙여 문자열 만들기

HICHULOG·2023년 7월 13일
0

프로그래머스

목록 보기
18/38
post-thumbnail

부분 문자열 이어 붙여 문자열 만들기

📝 문제

길이가 같은 문자열 배열 my_strings와 이차원 정수 배열 parts가 매개변수로 주어집니다. parts[i]는 [s, e] 형태로, my_string[i]의 인덱스 s부터 인덱스 e까지의 부분 문자열을 의미합니다. 각 my_strings의 원소의 parts에 해당하는 부분 문자열을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

⛔️ 제한 사항

  • 1 ≤ my_strings의 길이 = parts의 길이 ≤ 100
  • 1 ≤ my_strings의 원소의 길이 ≤ 100
  • parts[i]를 [s, e]라 할 때, 다음을 만족합니다.
    0 ≤ s ≤ e < my_strings[i]의 길이

💡 풀이

function solution(my_strings, parts) {
    let result = "";
    for(let i=0; i<my_strings.length; i++){
        const [a,b] = parts[i];
        result += my_strings[i].slice(a,b+1);
    }
    return result;
}

✅ 다른 풀이

function solution(my_strings, parts) {
    return parts.map(([s, e], i) => {
        return my_strings[i].slice(s, e + 1)
    }).join('')
}

=> return을 그냥 반환해주는 명령문이라고만 생각해서 왜 return을 두번쓰지 했는데, return 명령문은 함수 실행을 종료하고, 주어진 값을 '함수 호출 지점으로 반환'합니다.이 구문을 보고 이해할 수 있었다. map안에 return은 parts의 원소를 반환해주고 밖의 return은 parts.map().join('')값을 반환해 준다.

function solution(my_strings, parts) {
  return my_strings.reduce((result, str, i) => {
    const [s, e] = parts[i];
    return result + str.substring(s, e + 1);
  }, '');
}

=> substring()메서드와 slice()메서드의 차이점이 궁금해 졌다. 기능상으로는 부분문자열을 반환해주는 것이 같은데 mdn 공식문서를 보니 index가 음수일 때 차이가 있는 것으로 보인다. 자세한 내용은 TIl부분에 정리해 보았다.

function solution(my_strings, parts) {
    var answer = '';

    return my_strings.map((e,i) => e.substring(parts[i][0], parts[i][1]+1)).join("");
}

=> 나와 같은 풀이를 map()메서드와 substring()을 이용해 간결하게 풀었다.

🚀 TIL

String.prototype.slice() vs String.prototype.substring()

두 메서드는 시작 인덱스로 부터 종료 인덱스 전 까지 문자열의 부분 문자열을 반환한다.

String.prototype.slice()

[beginIndex]
추출 시작점인 0부터 시작하는 인덱스입니다. 만약 음수라면, beginIndex는 strLength(문자열 길이) + beginIndex로 취급됩니다. (예를 들어 beginIndex가 -3이면 시작점은 strLength - 3).
만약 beginIndex가 strLength 보다 크거나 같은 경우, slice()는 빈 문자열을 반환합니다.
[endIndexOptional]
0부터 시작하는 추출 종료점 인덱스로 그 직전까지 추출됩니다. 인덱스 위치의 문자는 추출에 포함되지 않습니다.
만약 endIndex가 생략된다면, slice()는 문자열 마지막까지 추출합니다. 만약 음수라면, endIndex는 strLength(문자열 길이) + endIndex 로 취급됩니다(예를 들어 endIndex가 -3이면 종료점은 strLength - 3).


String.prototype.substring()

substring() 메서드는 indexStart 부터 문자를 추출하지만 indexEnd 가 포함되지 않아도 괜찮습니다. 특징은 아래와 같습니다.

  • 만약 indexEnd 가 생략된 경우, substring() 문자열의 끝까지 모든 문자를 추출합니다.
  • 만약 indexStart 가 indexEnd와 같을 경우, substring() 빈 문자열을 반환합니다.
  • 만약 indexStart 가 indexEnd보다 큰 경우, substring() 메서드는 마치 두 개의 인자를 바꾼 듯 작동하게 됩니다.

0보다 작은 인자 값을 가지는 경우에는 0으로, stringName.length 보다 큰 인자 값을 가지는 경우, stringName.length 로 처리됩니다. NaN 값은 0으로 처리됩니다.

var text = 'Mozilla';

console.log(text.substring(5, 2)); // => "zil"
console.log(text.slice(5, 2));     // => ""
console.log(text.substring(-5, 2)); // => "Mo"
console.log(text.substring(-5, -2)); // => ""
console.log(text.slice(-5, 2)); // => ""
console.log(text.slice(-5, -2)); // => "zil"
profile
🚀 Front-end Dev

0개의 댓글