알파벳 소문자로 이루어진 문자열 myString이 주어집니다. 알파벳 순서에서 "l"보다 앞서는 모든 문자를 "l"로 바꾼 문자열을 return 하는 solution 함수를 완성해 주세요.
L보다 앞서는 문자열을 조건으로 걸기 위해 아스키 코드를 사용하기로 했다. 막상 풀고 보니 메모리를 엄청 잡아 먹고 처리 속도도 느린 거다.
이유를 찾다 문자열을 answer에 계속 누적해 주는 과정에 있다는 걸 알았다. 자바에서는 문자열을 갱신하는 게 아니라 새로운 요소가 추가될 때마다 새로 인스턴스를 만드니까 StringBuffer를 배웠었지 생각이 나면서..
그래서 생각난 김에 수정을 해보았다!
class Solution {
public String solution(String myString) {
String answer = "";
for(int i=0; i<myString.length(); i++){
if(myString.charAt(i) < 108){
answer += "l";
}else{
answer += String.valueOf(myString.charAt(i));
}
}
return answer;
}
}
앞서 말한 것처럼 StringBuffer 객체를 활용해 append()로 누적한 다음, 반환 타입에 맞게 String.valueOf()로 변환해 반환했다. 코드 상의 큰 차이는 없는데 할당된 메모리와 처리 속도의 차이가 엄청 놀라웠다.
class Solution {
public String solution(String myString) {
StringBuffer answer = new StringBuffer();
for(int i=0; i<myString.length(); i++){
if(myString.charAt(i) < 108){
answer.append("l");
}else{
answer.append(String.valueOf(myString.charAt(i)));
}
}
return String.valueOf(answer);
}
}
이렇게 놓고 비교해 보니 정말 어마어마한 거다. 특히 첫 번째 테스트 케이스 무슨 일이 일어나고 있나요...? 아주 간단한 코딩 테스트 문제에서 소중한 걸 배우게 되었다.

