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();