카테고리 없음

[Java][programers][level1] 핸드폰 번호 가리기(char 배열의 중요성)

키보드발 2022. 10. 2. 19:22
public class Solution {
    public String solution(String phone_number) {
        String answer = "";
        int phoneLen = phone_number.length();
        int showLen = 4;
        int hideLen = (phoneLen - 1) - showLen;
        for (int i = 0; i <phoneLen ; i++) {
            if(i <= hideLen) answer+="*";
            else answer += phone_number.charAt(i);
        }
        return answer;
    }
    //위의 코드에 비해 속도 10배 빠름
    public String solution2(String phone_number) {
        char[] ch = phone_number.toCharArray();
        for(int i = 0; i < ch.length - 4; i ++){
            ch[i] = '*';
        }
        return String.valueOf(ch);
    }
}

solution2를 쓰는게 맞다.

그동안 String에 대해 깊이 생각을 안해 봤던것 같다.

위와 아래의 속도가 왜 10배나 차이가 나냐면

 

먼저 char[]의 값을 바꿀 때를 생각해보자.

char[]

[ 1 ] [ 2 ] [ 3 ] [ 4 ]

1의 값을 x로 2의 값을 y로 바꿀 수 있다.

이는 새로운 배열을 만들고 그 배열로 참조값을 바꾸는게 아니다. char[]의 일부 값을 바꾸는 것이다.

 

반면 아래의 경우를 보자.

        for (int i = 0; i <phoneLen ; i++) {
            if(i <= hideLen) answer+="*";
            else answer += phone_number.charAt(i);
        }​

아래의 코드가 문제라는 거다.

answer+="*";
answer += phone_number.charAt(i);​

해당 코드를 보면 단순히 문자를 더 하는것이지만 이것은 char[]의 일부를 바꾸는 것에 비하면 훨씬 부하가 들어간다.

왜냐하면

answer이 1을 가리키고 있다했을때

answer= answer + "X"를 연산한다고 하면 answer이 가리키는 배열 맨뒤에 값을 붙여주고 끝나는 개념이 아니라

새로운 String을 만들고 answer+"x"의 값을 넣은후 answer에 그 주소값을 넣는 것이기 때문이다.

위와 비교했을때 어떤가?

너무나도 할것이 많다.

 

char[]의 일부 바꾸기 vs String을 새로만들고 그 주소값으로 바꾸기 

 

딱봐도 전자가 훨씬 빠를 것이다.

 

즉  String의 일부를 바꿔야한다면 성능을 위해 String을 연산하여 문제를 해결하려하지말고

String.toCharArray()이용하여 배열로 만든 후 char 배열의 일부를 수정하는 방식으로 해결하도록 하자.

char[] ch = phone_number.toCharArray();

압도적인 속도차이