문자열 my_string과 이차원 정수 배열 queries가 매개변수로 주어집니다. queries의 원소는 [s, e] 형태로, my_string의 인덱스 s부터 인덱스 e까지를 뒤집으라는 의미입니다. my_string에 queries의 명령을 순서대로 처리한 후의 문자열을 return 하는 solution 함수를 작성해 주세요.
제한사항
function solution(my_string, queries) {
let splitStr = my_string.split('');
for (let [s, e] of queries) {
let middle = splitStr.slice(s, e + 1).reverse();
splitStr.splice(s, e - s + 1, ...middle);
}
return splitStr.join('');
}
와 이거 진짜 어려웠다 ㅠㅠ 배열 메서드를 제대로 알아야 정확하게 풀 수 있는 문제였다. 이거 때문에 엄청 고생함... 그러니까 공부를 잘 해둬야 하는 것임!
splitStr.slice(s, e + 1)
), reverse() 메서드를 통해 반전시킨다. 그리고 이 결과를 middle 변수에 할당한다.e - s + 1
을 넣어줘야 올바르게 제거하고 새로운 요소를 추가할 수 있다.
slice()
와splice()
의 차이
splice() 메서드의 두 번째 인자
두 번째 인자는 삭제할 요소의 '수'를 지정하는 것이지, 인덱스를 뜻하는 것이 아니다!!
array.splice(start, deleteCount, item1, item2, ...)
→ 변경을 시작할 인덱스(start
)부터 제거할 요소의 수(deleteCount
)를 지정하여 삭제한다. (만약 deleteCount를 0으로 설정하면 어떠한 요소도 제거하지 않고 새 요소를 추가할 수 있다.)
→ item1, item2, ...
는 배열에 추가될 요소들을 의미한다. 추가하지 않는다면 요소를 제거하기만 할 수 있다.
slice()
array.slice(start, end)
/ string.slice(start, end)
slice()의 두 번째 인자는 추출을 끝내고자 하는 인덱스를 뜻한다 (해당 인덱스의 요소는 포함 x)
function solution(my_string, queries) {
let str = my_string.split('');
queries.forEach(([start, end]) => {
const changeStr = str.slice(start, end + 1);
str.splice(start, changeStr.length, ...changeStr.reverse());
});
return str.join('');
}
여기서는 for...of
가 아니라 forEach를 통해서 순환한다는 점이 다른 점임.
function solution(my_string, queries) {
const str = [...my_string];
queries.forEach(([s,e]) => {
while(s < e) {
[str[s], str[e]] = [str[e], str[s]];
s++; e--;
}
})
return str.join("");
}
오 이러한 풀이는 또 신박하고... 신기하다... 하 기본적인 것도 제대로 공부가 안 되어있는 나 자신에게 반성하고 감.