s
실제 숫자나 영어로 표기한 숫자들을 문자열로 나타낸 것 | "one4seveneight"
=> 문자열 s에 속한 영어를 다 숫자로 치환하여 return
영어를 숫자로 replace
class Solution {
public int solution(String s) {
String[] nums = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
for(int i=0; i<10; i++){
s = s.replace(nums[i], i+"");
}
return Integer.parseInt(s);
}
}
=> 해당 영어 문자열이 없어도 다 replace 연산을 하기 때문에, 실행 시간이 크게 나왔다고 생각됨. 하지만 contains를 쓰면 O(N)만큼 더 스캔을 하기 때문에 더 오버헤드적인 연산일 것이므로 다른 방법을 고민해봐야겠음..
=> Integer.toString() 또는 String.valueOf() 연산을 쓰면 시간을 단축시킬 수 있었다
Integer.toString()와 String.valueOf()는 null을 예외로 띄우는가 "null"이라는 문자열로 가지고 있는지의 차이를 가지므로, String.valueOf()를 사용하는 것이 좋다.
class Solution {
public int solution(String s) {
StringBuilder ans = new StringBuilder();
StringBuilder eng_num = new StringBuilder();
for (char ch : s.toCharArray()) {
if (Character.isDigit(ch)) {
ans.append(ch);
} else {
eng_num.append(ch);
if (eng_num.length() >= 3) {
String word = eng_num.toString();
switch (word) {
case "zero":
ans.append("0");
eng_num = new StringBuilder();
break;
case "one":
ans.append("1");
eng_num = new StringBuilder();
break;
case "two":
ans.append("2");
eng_num = new StringBuilder();
break;
case "three":
ans.append("3");
eng_num = new StringBuilder();
break;
case "four":
ans.append("4");
eng_num = new StringBuilder();
break;
case "five":
ans.append("5");
eng_num = new StringBuilder();
break;
case "six":
ans.append("6");
eng_num = new StringBuilder();
break;
case "seven":
ans.append("7");
eng_num = new StringBuilder();
break;
case "eight":
ans.append("8");
eng_num = new StringBuilder();
break;
case "nine":
ans.append("9");
eng_num = new StringBuilder();
break;
}
}
}
}
return Integer.parseInt(ans.toString());
}
}
TIP : int형을 String으로 바꾸는 연산에는 숫자+"" 보다 String.valueOf(숫자)가 훨씬 효율적인 방법이다