문제
단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.
나의 풀이
class Solution {
fun solution(s: String): String {
var answer = ""
if (s.length % 2 == 0) {
answer = "${s[s.length / 2 - 1]}${s[(s.length / 2)]}"
} else {
answer = s[s.length / 2].toString()
}
return answer
}
}
고수의 풀이
class Solution {
fun solution(s: String) =
with(s) { substring(length / 2 - 1 + (length % 2) .. length / 2) }
}
배운점
- with()의 활용
- with은 특정 객체를 활용하여 수행할 작업들을 그 객체 범위 내에서 실행할 수 있도록 하는 함수이다.
- 고수의 풀이에서는 s에 대한 확장 함수를 호출하는데, s에 대한 작업을 할 때 매번 s.로 시작하는 것을 피하기 위함이다. with 블록 안에서는 s가 없어도 해당 문자열에 접근할 수 있다.
- substring의 활용
- 긁어올 문자의 범위를 지정하게끔 한다.
- 'length / 2 - 1' : 문자열의 중간 인덱스로 이동
- '+ (length % 2)' : 문자열의 길이가 !홀수!일 경우 추가적으로 한 글자 더 이동
- '..length / 2' : 중간 인덱스부터 문자열 끝까지의 범위를 지정 (..은 범위 연산자)
- 고수는 substring 함수의 매개변수로 전달되는 인덱스를 계산하는 부분에서 조건문 없는 조건(?)식 사용했다.
- substring안에는 시작과 끝 인덱스의 값을 직접 지정하거나 ..을 이용하여 범위로 표현을 할 수 있다.
- 여기서 s의 길이가 홀수라면 그 범위가 x~x 이지만, 짝수라면 x-1~x가 나올 수 있는 계산식이다. 어떻게 이런 생각을.. 정말 대단한 것 같다..
[TIL-240227]