길이가 같은 문자열 배열 my_strings와 이차원 정수 배열 parts가 매개변수로 주어집니다. parts[i]는 [s, e] 형태로, my_string[i]의 인덱스 s부터 인덱스 e까지의 부분 문자열을 의미합니다. 각 my_strings의 원소의 parts에 해당하는 부분 문자열을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.
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()을 이용해 간결하게 풀었다.
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"