241104 문자열 여러 번 뒤집기

수달·2024년 11월 3일

Lv.0 문자열 여러 번 뒤집기

https://school.programmers.co.kr/learn/courses/30/lessons/181913?language=javascript

문제 설명

문자열 my_string과 이차원 정수 배열 queries가 매개변수로 주어집니다. queries의 원소는 [s, e] 형태로, my_string의 인덱스 s부터 인덱스 e까지를 뒤집으라는 의미입니다. my_string에 queries의 명령을 순서대로 처리한 후의 문자열을 return 하는 solution 함수를 작성해 주세요.

제한사항

  • my_string은 영소문자로만 이루어져 있습니다.
  • 1 ≤ my_string의 길이 ≤ 1,000
  • queries의 원소는 [s, e]의 형태로 0 ≤ s ≤ e < my_string의 길이를 만족합니다.
  • 1 ≤ queries의 길이 ≤ 1,000

입출력 예

my_string // queries // result
"rermgorpsam" // [[2, 3], [0, 7], [5, 9], [6, 10]] // "programmers"

풀이

  1. 문자열을 배열로 변환
  2. for문으로 s,e구간 반복
  3. 문자 내장 객체 slice(주어진 인덱스 범위에 해당하는 문자열 반환) 사용해 s부터 e까지 복사해 새 배열로 반환
  4. 배열 내장 객체 splice(기존 요소 제거하거나 대체해 새 요소 추가) 사용해 인덱스 s에서 e-s+1개 요소를 새로운 뒤집힌 부분으로 대체
function solution(my_string, queries) {
  // 문자열을 배열로 변환해 조작할 수 있게 함
  let arr = my_string.split("");
  
  for (let i = 0; i < queries.length; i++) {
    let s = queries[i][0];
    let e = queries[i][1];
    // s부터 e까지 배열의 부분을 슬라이싱하고, 뒤집음
    let reversedPart = arr.slice(s, e + 1).reverse();
    arr.splice(s, e - s + 1, ...reversedPart); // 뒤집은 부분을 원래 배열에 다시 넣음
    // 인덱스 s에서 e-s+1개 요소를 ...reversedPart로 대체
  }

  // 배열을 문자열로 변환하여 결과 반환
  return arr.join("");
}

예시

1. 문자열을 배열로 변환

  • my_string이 "rermgorpsam" 이라면?

arr = ['r', 'e', 'r', 'm', 'g', 'o', 'r', 'p', 's', 'a', 'm'];

2. for문으로 s,e구간 반복

  • queries가 [[2, 3], [0, 7], [5, 9], [6, 10]]이라면?

첫 번째 반복에서는 s = 2, e = 3

3. 문자 내장 객체 slice(주어진 인덱스 범위에 해당하는 문자열 반환) 사용해 s부터 e까지 복사해 새 배열로 반환

  • 첫 번째 반복) 만약 s = 2이고 e = 3이라면?

arr.slice(2, 4)는 ['r', 'm']을 반환하고, 이를 뒤집으면 ['m', 'r']
reversedPart = ['m', 'r']

4. 배열 내장 객체 splice(기존 요소 제거하거나 대체해 새 요소 추가) 사용해 인덱스 s에서 e-s+1개 요소(시작과 끝을 포함한 요소 개수)를 새로운 뒤집힌 부분으로 대체

  • 첫 번째 반복) arr이 ['r', 'e', 'r', 'm', 'g', 'o', 'r', 'p', 's', 'a', 'm']일 때, s = 2, e = 3 이라면?
  • 2부터 3까지 2개 요소(r,m)를 포함하고 있기 때문에
    e-s+1 = 3-2+1 = 2

arr.splice(2, 2, 'm', 'r')가 호출되어
arr = ['r', 'e', 'm', 'r', 'g', 'o', 'r', 'p', 's', 'a', 'm']

0개의 댓글