Backdrop

프로그래머스 ▸ 코딩 기초 트레이닝

문자열 여러 번 뒤집기
0

문제 설명

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

제한사항

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

입출력 예

my_stringqueriesresult
"rermgorpsam"[[2, 3], [0, 7], [5, 9], [6, 10]]"programmers"

입출력 예 설명

  • 예제 1번의 my_string은 "rermgorpsam"이고 주어진 queries를 순서대로 처리하면 다음과 같습니다.

    queriesmy_string
    "rermgorpsam"
    [2, 3]"remrgorpsam"
    [0, 7]"progrmersam"
    [5, 9]"prograsremm"
    [6, 10]"programmers"

    따라서 "programmers"를 return 합니다.

풀이

map() 함수를 이용해서 먼저 number를 숫자 배열로 바꿔요. 그리고 reduce() 함수를 이용해서 배열의 합을 구하고 9로 나눈 나머지를 구해요.

reduce() 함수 안에서 splice() 함수를 이용해서 배열 내용을 변경해요. reverse() 함수를 이용해서 배열을 뒤집어요.

이론

Array.prototype.reduce()

배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환해요.

arr.reduce(callback[, initialValue]);

callback 함수는 네 개의 인자를 가져요.

  • accumulator (acc, prev) : 콜백의 반환값을 누적
  • currentValue (cur, curr) : 처리할 현재 요소
  • currentIndex (idx, index) : 처리할 현재 요소의 인덱스 (optional)
  • array (src) : reduce()를 호출한 배열 (optional)

initialValue를 제공한 경우, accinitialValue와 같고, cur는 배열의 첫 번째 요소와 같아요.

initialValue를 제공하지 않은 경우, acc는 배열의 첫 번째 요소와 같고, cur는 두 번째 요소와 같아요.

const arr = [1, 2, 3, 4, 5];
const sum = arr.reduce((prev, curr) => prev + curr, 0);
console.log(sum); // 15

map vs reduce

map()은 반환값이 같은 길이의 배열이고, reduce()는 반환값이 무엇이든 상관없어요. 주어진 조건에 따라 map()reduce() 또는 다른 메서드를 사용해야 해요.

Array.prototype.splice()

splice() 메서드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경해요.

array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
  • start : 배열의 변경을 시작할 인덱스에요. 만약 음수라면 배열의 끝에서부터 요소를 세어요. (예를 들어, -1은 마지막 요소를 나타내요.)
  • deleteCount : 배열에서 제거를 할 요소의 수에요. 만약 deleteCount가 0이면, 어떤 요소도 제거되지 않아요. 이 경우에는 최소한 하나의 새로운 요소를 지정해야 해요.
  • item1, item2, ... : 배열에 추가될 요소에요. 아무 요소도 지정하지 않으면 splice()는 요소를 제거하기만 해요.

splice()는 제거한 요소를 담은 배열을 반환해요. 아무 값도 제거하지 않았으면 빈 배열을 반환해요.

const months = ['Jan', 'March', 'April', 'June'];
months.splice(1, 0, 'Feb');
// Inserts at index 1
console.log(months);
// Expected output: Array ["Jan", "Feb", "March", "April", "June"]
 
months.splice(4, 1, 'May');
// Replaces 1 element at index 4
console.log(months);
// Expected output: Array ["Jan", "Feb", "March", "April", "May"]

Array.prototype.slice()

slice() 메서드는 어떤 배열의 begin 부터 end 까지(end 미포함)에 대한 얕은 복사본을 새로운 배열 객체로 반환해요. 원본 배열은 바뀌지 않아요.

arr.slice([begin[, end]])
  • begin 또는 end 가 음수인 경우, 배열의 끝에서부터의 길이를 나타내요.
  • begin 이 생략된 경우, 0 번째 인덱스부터 추출해요.
  • end 가 생략된 경우, 배열의 끝까지 추출해요.
const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];
 
console.log(animals.slice(2));
// Expected output: Array ["camel", "duck", "elephant"]
 
console.log(animals.slice(2, 4));
// Expected output: Array ["camel", "duck"]
 
console.log(animals.slice(1, 5));
// Expected output: Array ["bison", "camel", "duck", "elephant"]
 
console.log(animals.slice(-2));
// Expected output: Array ["duck", "elephant"]
 
console.log(animals.slice(2, -1));
// Expected output: Array ["camel", "duck"]
 
console.log(animals.slice());
// Expected output: Array ["ant", "bison", "camel", "duck", "elephant"]

코드

function solution(my_string, queries) {
  return queries
    .reduce(
      (acc, [s, e]) => {
        acc.splice(s, e - s + 1, ...acc.slice(s, e + 1).reverse());
 
        return acc;
      },
      [...my_string]
    )
    .join('');
}