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

[Kotlin] Leetcode 344. Reverse String

by 개발자J의일상 2022. 2. 16.
반응형

 

Write a function that reverses a string. The input string is given as an array of characters s.

You must do this by modifying the input array in-place with O(1) extra memory.

 

Example 1:

Input: s = ["h","e","l","l","o"]
Output: ["o","l","l","e","h"]

Example 2:

Input: s = ["H","a","n","n","a","h"]
Output: ["h","a","n","n","a","H"]

 

Constraints:

 

정말 간단한 문제로 CharArray의 시작점과 끝점을 찾아서 l, r로 설정을 하고 

l를 하나씩 증가 시키고, r를 하나씩 감소시키면서 s의 index에 접근하여 해당하는 element를 교환하면 됩니다.

l가 r 보다 커지면 교차하는 지점에 왔다는 의미이므로 더이상 교환을 하면 안됩니다.

class Solution {
    fun reverseString(s: CharArray): Unit {
        var l = 0
        var r = s.size-1
        while(l < r)
        {
            val temp = s[l]
            s[l] = s[r]
            s[r] = temp
            l++
            r--
        }
    }
}

 

아래 솔루션도 마찬가지인데 Kotlin스러운 풀이라서 가져와봤습니다.

 

class Solution {
    fun reverseString(s: CharArray): Unit {
        var start = 0
        var end = s.lastIndex
        while (start < end){
            s[start] = s[end].also { s[end] = s[start] }
            start++
            end--
        }
    }
}

also

컨텍스트 개체는 인수(it)로 사용할 수 있습니다. 반환 값은 개체 자체입니다.

 

컨텍스트 개체를 인수로 사용하는 일부 작업을 수행하는 데도 좋습니다.

속성 및 기능이 아닌 개체에 대한 참조가 필요한 작업이나 외부 범위에서 이 참조를 숨기고 싶지 않는 경우에도 사용합니다.

 

코드에서 볼 수 있듯이 "그리고 또한 개체에 대해 다음을 수행합니다." 로 읽을 수 있습니다.

inline fun <T> T.also(block: (T) -> Unit): T
(source)

이 값을 인수로 사용하여 지정된 기능 block을 호출하고 이 값을 반환합니다.

 

따라서 s[start] = s[end].also { s[end] = s[start] } 로 수행을 하게 되면 s[start] = s[end]를 수행하고 s[end] = s[start]를도 수행하라는 것이 됩니다.

이때 드는 의문은 s[start] = s[end]를 하면 s[start]가 이미 변경되어서 s[end] = s[start]를 수행하게 되면 s[end] = s[end]가 되는 것이 아닌가라는 생각이 듭니다.

하지만 T는 also의 수신객체인데 return이 된 뒤에 값이 변경이 됩니다. 

따라서 s[end]가 가지고 있는 값은 s[start]에 update가 되고 나면 s[end] = s[start]가 적용이 된다고 볼 수 있습니다.

 

300x250

댓글