본문 바로가기
알고리즘/Programmers

[TIL] 2023.05.14 Programmers_문자열 여러 번 뒤집기

by heereal 2023. 5. 14.

문자열 여러 번 뒤집기

문제 설명

문자열 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인 배열로만 나눠지지 않는 경우가 있겠다는 생각이 들었다. 그렇다면 문제는 어떻게 하면 기존 문자열에서 특정 부분만 뒤집은 후에 합치냐는 것인데 고민이 좀 필요할 거 같다.

 

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 = answer.substr(0, a);
        let end = answer.substr(b + 1);
        answer = start + slice.split("").reverse().join("") + end;
    }
    return answer;
}
  1. answer라는 변수를 선언 후 초기값으로 my_string을 할당한다.
  2. queries 배열을 for문을 이용하여 반복한다.
  3. slice 메서드를 이용하여 queries 각 요소의 인덱스만큼 answer 문자열을 자른다.
  4. split, reverse, join 메서드를 이용하여 인덱스만큼 자른 문자열을 뒤집는다.
  5. substr 메서드를 이용하여 slice 앞뒤로 문자열을 자른 후 start, end 변수에 할당한다.
  6. start + 자른 후 뒤집은 문자열 + end를 이어 붙여 answer에 재할당한다.
  7. 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

 

 

 

댓글