네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
s | result |
---|---|
"one4seveneight" | 1478 |
"23four5six7" | 234567 |
"2three45sixseven" | 234567 |
"123" | 123 |
문제를 보고 Map을 써야 겠다 생각해서 Map에 문자열로된 숫자와 영문을 집어넣고 문자열을 돌면서 해당 영어단어가 Map에 존재하면 키값으로 변경해서 넣는 방법을 썻다.
import java.util.HashMap;
import java.util.Map;
class Solution {
public int solution(String s) {
int answer = 0;
// map으로 정리하기
Map<String,String> map = new HashMap<>();
map.put("zero", "0");
map.put("one", "1");
map.put("two", "2");
map.put("three", "3");
map.put("four", "4");
map.put("five", "5");
map.put("six", "6");
map.put("seven", "7");
map.put("eight", "8");
map.put("nine", "9");
StringBuilder result = new StringBuilder();
StringBuilder word = new StringBuilder();
for (int i = 0; i <s.length() ; i++) {
word.append(s.charAt(i));
if(map.containsKey(String.valueOf(word))){
result.append(map.get(String.valueOf(word)));
word.setLength(0);
}else if(s.charAt(i)>='0' && s.charAt(i)<='9'){
result.append(s.charAt(i));
word.setLength(0);
}
}
answer = Integer.valueOf(String.valueOf(result));
return answer;
}
}
String 내장함수인 replaceAll을 이용한 풀이법이다.
역시 세상에는 더더욱 나은 코드가 존재한다...
public int solution1(String s) {
String[] digits = {"0","1","2","3","4","5","6","7","8","9"};
String[] alphabets = {"zero","one","two","three","four","five","six","seven","eight","nine"};
for(int i=0; i<10; i++){
s = s.replaceAll(alphabets[i],digits[i]);
}
return Integer.parseInt(s);
}
replaceAll은 Java의 String 클래스에서 제공하는 메서드입니다. replaceAll 메서드는 문자열에서 일치하는 모든 부분을 새로운 문자열로 대체하는 기능을 제공합니다. 일치하는 부분은 정규식(regular expression)으로 지정할 수 있습니다.
예를 들어, 다음 코드는 "Hello, world!" 문자열에서 모든 쉼표(,)를 점(.)으로 대체합니다.
String str = "Hello, world!";
str = str.replaceAll(",", ".");
// 결과 : Hello. world!";