문자열 여러 번 뒤집기
문제 설명
문자열 my_string과 이차원 정수 배열 queries가 매개변수로 주어집니다. queries의 원소는 [s, e] 형태로, my_string의 인덱스 s부터 인덱스 e까지를 뒤집으라는 의미입니다. my_string에 queries의 명령을 순서대로 처리한 후의 문자열을 return 하는 solution 함수를 작성해 주세요.
입출력 예
my_string | queries | result |
"rermgorpsam" | [[2, 3], [0, 7], [5, 9], [6, 10]] | "programmers" |
나의 1차 풀이
function solution(my_string, queries) {
let answer = my_string;
for (const [a, b] of queries) {
let slice = answer.slice(a, b + 1);
let [start, end] = answer.split(slice);
answer = start + slice.split("").reverse().join("") + end;
}
return answer;
}
통과하지 못하는 테스트 케이스가 너무 많다. 어디가 문제일까 생각해 봤는데 만약에 my_string에 동일한 slice가 여러 개일 때 split 결과가 딱 length가 2인 배열로만 나눠지지 않는 경우가 있겠다는 생각이 들었다. 그렇다면 문제는 어떻게 하면 기존 문자열에서 특정 부분만 뒤집은 후에 합치냐는 것인데 고민이 좀 필요할 거 같다.
나의 최종 풀이
function solution(my_string, queries) {
let answer = my_string;
for (const [a, b] of queries) {
let slice = answer.slice(a, b + 1);
let start = answer.substr(0, a);
let end = answer.substr(b + 1);
answer = start + slice.split("").reverse().join("") + end;
}
return answer;
}
- answer라는 변수를 선언 후 초기값으로 my_string을 할당한다.
- queries 배열을 for문을 이용하여 반복한다.
- slice 메서드를 이용하여 queries 각 요소의 인덱스만큼 answer 문자열을 자른다.
- split, reverse, join 메서드를 이용하여 인덱스만큼 자른 문자열을 뒤집는다.
- substr 메서드를 이용하여 slice 앞뒤로 문자열을 자른 후 start, end 변수에 할당한다.
- start + 자른 후 뒤집은 문자열 + end를 이어 붙여 answer에 재할당한다.
- for문이 끝나면 최종적으로 answer를 return한다.
다른 사람의 풀이
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('');
}
내 풀이처럼 문자열을 조각낸 후에 +로 이어 붙이는 방법 외에 splice로 한 번에 처리하는 방법이 있었다! 그리고 splice는 원본 배열 자체를 수정하기 때문에 일일이 변수에 재할당해 줄 필요도 없다.
내가 고민했던 부분이 문자열에서 특정 부분만 교체할 수 있는가 하는 점이었는데, 아예 처음부터 배열로 접근하니까 splice 메서드를 이용해 배열의 특정 부분만 교체하는 것이 가능해졌다.
str.splice(start, changeStr.length, ...changeStr.reverse());
start(인덱스)부터 시작해서 changeStr.length만큼을 changeStr.reverse() 즉 뒤집어진 문자열로 교체한다.
Array.prototype.splice()
- splice() 메서드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경합니다.
매개변수
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
- start: 배열의 변경을 시작할 인덱스입니다. 배열의 길이보다 큰 값이라면 실제 시작 인덱스는 배열의 길이로 설정됩니다. 음수인 경우 배열의 끝에서부터 요소를 새어나갑니다(원점 -1, 즉 -n이면 요소 끝의 n번째 요소를 가리키며 array.length - n번째 인덱스와 같음). 값의 절댓값이 배열의 길이보다 큰 경우 0으로 설정됩니다.
- deleteCount (Optional): 배열에서 제거할 요소의 수입니다. deleteCount를 생략하거나 값이 array.length - start보다 크면 start부터의 모든 요소를 제거합니다. deleteCount가 0 이하라면 어떤 요소도 제거하지 않습니다. 이 때는 최소한 하나의 새로운 요소를 지정해야 합니다.
- item1, item2,... (Optional): 배열에 추가할 요소입니다. 아무 요소도 지정하지 않으면 splice()는 요소를 제거하기만 합니다.
var myFish = ['angel', 'clown', 'trumpet', 'sturgeon'];
var removed = myFish.splice(0, 2, 'parrot', 'anemone', 'blue');
// myFish is ["parrot", "anemone", "blue", "trumpet", "sturgeon"]
// removed is ["angel", "clown"]
- 0번 인덱스에서 두 개 요소 제거하고 "parrot", "anemone", "blue" 추가하기
출처 https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
'알고리즘 > Programmers' 카테고리의 다른 글
[TIL] 2023.05.17 Programmers_수열과 구간 쿼리 2 (0) | 2023.05.17 |
---|---|
[TIL] 2023.05.15 Programmers_배열 만들기2 (0) | 2023.05.15 |
[TIL] 2023.05.13 Programmers_마지막 두 원소 (4) | 2023.05.13 |
[TIL] 2023.05.12 Programmers_코드 처리하기 (0) | 2023.05.13 |
[TIL] 2023.05.11 Programmers_부분 문자열 이어 붙여 문자열 만들기 (0) | 2023.05.11 |
댓글