Post

Basic40 문자열 여러 번 뒤집기

1
## 문제: 문자열 여러 번 뒤집기 ###### 문제 설명

문자열 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_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 합니다.


Solution

처음 풀이는 조금 복잡했습니다. 먼저 my_string을 배열로 만들고, queriesreduce(into: array)를 사용해서 arr.reversed()를 써서 arr안의 요소들을 뒤집어 주는 방식을 사용했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import Foundation

func solution(_ my_string:String, _ queries:[[Int]]) -> String {
    var array = Array(my_string)
    let result = queries.reduce(into: array) { arr, q in
        let (s, e) = (q[0], q[1])
        let reversedArray = Array(arr[s...e].reversed())
        for i in s...e{
            arr[i] = reversedArray[i-s]
        }
        
    }
    return String(result)
}

원리는 동일하지만 .reverse() 함수를 알게되어 아래와 같이 코드를 조금 다듬었습니다.

1
2
3
4
5
6
7
func solution(_ my_string:String, _ queries:[[Int]]) -> String {
	var array = Array(my_string)
    let result = queries.reduce(into: array) { arr, q in
        arr[q[0]...q[1]].reverse()
    }
    return String(result)
}