문제
문자열 my_string이 매개변수로 주어집니다. my_string을 거꾸로 뒤집은 문자열을 return하도록 solution 함수를 완성해주세요.
풀이
1. 접근
1.1 관찰
문자열을 거꾸로 반환하는 문제
입력 : 문자열
출력 : 문자열
1.2 계획
뒤집어주는 메소드가 있을 것 같아 찾아봤다.
public inline fun String.reversed(): String {
return (this as CharSequence).reversed().toString()
}
reversed() : 역순 문자열로 반환해주는 메소드
reverse()라는 메소드도 있는데 배열에서 사용하는 메소드이니 주의
2. 시행착오
2.1 시도
class Solution {
fun solution(my_string: String): String = my_string.reversed()
}
검증결과 : 성공
메소드를 쓰지 않고 구현하고 싶어서 찾아보다가 문법책으로 공부했던 문자열의 + 연산자와 관련된 방법이 나왔다.
class Solution {
fun solution(my_string: String): String {
var answer: String = ""
for (i in my_string.indices) {
answer = my_string[i] + answer
}
return answer
}
}
abc
a + = a
b + a = ba
c + ba = cba (최종 주소값. 위에 객체들은 미아객체가 된다.)
참조변수인 String형의 객체는 불변객체다. 왼쪽 문자열 뒤에 오른쪽 문자열을 그대로 붙여 새로운 Heap영역에 만들고 주소값을 반환하게 된다. 이 방법은 문자열의 길이가 길 경우 미아 객체가 많아지므로 성능을 저하시킬 수 있다.
String의 미아객체 문제를 해결할 수 있는 방법으로 StringBuilder라는 클래스가 있다. 이 클래스 생성자를 호출해 문자열 객체를 생성하면 해당 문자열에 연산할 때 주소값을 변경하는 게 아니라 값 자체를 수정해줘서 메모리 관리에 효율적이다. 클래스타입이므로 원본과 타입이 다르다는 점을 주의해야 한다.
class Solution {
fun solution(my_string: String): String {
val answer = StringBuilder(my_string).reverse()
return answer.toString()
}
}
insert()는 (인덱스번호, 값)으로 해당 인덱스 번호에 값을 삽입하는 메소드. 0번째 인덱스를 고정해두고 반복문으로 값을 넣는 방법이다.
class Solution {
fun solution(my_string: String): String {
val answer = StringBuilder()
for (i in my_string.indices) {
answer.insert(0, my_string[i])
}
return answer.toString()
}
}
StringBuilder외에 StringBuffer도 있어서 셋의 차이를 정리했다.
StringBuilder
가변객체이므로 값을 변경해야 할 때 사용. 멀티스레드 동시접근이 가능
StringBuffer
가변객체이므로 값을 변경해야 할 때 사용. 멀티스레드 동시접근을 막아 안전하나 접근제어 비용 발생
String
불변객체이므로 값을 변경하지 않을 때 사용. 멀티스레드 환경에서 안전
마지막으로 인덱스 마지막 번호에서부터 내려오면서 담는 방법이다. lastIndex로 썼는데 length -1 도 동일하다.
class Solution {
fun solution(my_string: String): String {
var answer: String = ""
for (i in my_string.lastIndex downTo 0) {
answer += my_string[i]
}
return answer
}
}
회고
팀원분들 높은 난이도의 코딩테스트 문제 푸는 걸 보면 시간과 비용을 고려해야되는구나를 어깨너머로 보곤 했다. 지금의 나는 해결방안을 찾는 것만으로도 급급하지만 미리 습관화하는 게 좋겠다.
메모리 영역을 어떻게 쓰고 있는지 알면서 공부하면 좀 더 이해가 잘 된다. String에 대한 도식이 계속 확장 및 수정되고 있는데 지식을 단계별로 쌓아가는 게 재밌다. 내가 배운 또는 내가 배울 모든 것들이 얼마나 더 많은 깊이와 넓이를 가지고 있을지 기대해보며 함부로 판단하지 말아야겠다고 느낀 회차.
'코틀린 > 코딩테스트' 카테고리의 다른 글
코딩테스트 [약수의 합] (0) | 2024.06.27 |
---|---|
코딩테스트 [짝수와 홀수] (0) | 2024.06.27 |
코딩테스트 [삼각형의 완성조건 (1)] (0) | 2024.06.25 |
코딩테스트 [배열의 유사도] (0) | 2024.06.25 |
코딩테스트 [최댓값 만들기(1)] (0) | 2024.06.25 |