[프로그래머스/Java] Lv.0 l로 만들기

febCho·2024년 3월 21일
0

코딩테스트

목록 보기
119/253
post-thumbnail

문제

알파벳 소문자로 이루어진 문자열 myString이 주어집니다. 알파벳 순서에서 "l"보다 앞서는 모든 문자를 "l"로 바꾼 문자열을 return 하는 solution 함수를 완성해 주세요.

- 제한사항

  • 1 ≤ myString ≤ 100,000
  • myString은 알파벳 소문자로 이루어진 문자열입니다.

풀이

- 정답 1

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;
    }
}

- 정답 2

앞서 말한 것처럼 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);
    }
}

- StringBuffer 사용 전후 차이

이렇게 놓고 비교해 보니 정말 어마어마한 거다. 특히 첫 번째 테스트 케이스 무슨 일이 일어나고 있나요...? 아주 간단한 코딩 테스트 문제에서 소중한 걸 배우게 되었다.

결과

profile
Done is better than perfect.

0개의 댓글