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:
- 1 <= s.length <= 105
- s[i] is a printable ascii character.
정말 간단한 문제로 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]가 적용이 된다고 볼 수 있습니다.
'알고리즘 > LeetCode' 카테고리의 다른 글
[C++] Leetcode 19. Remove Nth Node From End of List (0) | 2024.02.20 |
---|---|
[Kotlin] Leetcode 189. Rotate Array (0) | 2022.01.24 |
[Kotlin] Leetcode 977. Squares of a Sorted Array (0) | 2022.01.24 |
[Kotlin] Leetcode 35. Search Insert Position (0) | 2022.01.24 |
[Kotlin] Leetcode 278. First Bad Version (0) | 2022.01.20 |
댓글