네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s
가 매개변수로 주어집니다. s
가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.
숫자 | 영단어 |
---|---|
0 | zero |
1 | one |
2 | two |
3 | three |
4 | four |
5 | five |
6 | six |
7 | seven |
8 | eight |
9 | nine |
s
의 길이 ≤ 50s
가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.s
로 주어집니다.import java.util.HashMap;
import java.util.Map;
class Solution {
public int solution(String s) {
// 1. 영단어:숫자 맵 생성
Map<String, String> numMap = new HashMap<>();
numMap.put("zero", "0");
numMap.put("one", "1");
numMap.put("two", "2");
numMap.put("three", "3");
numMap.put("four", "4");
numMap.put("five", "5");
numMap.put("six", "6");
numMap.put("seven", "7");
numMap.put("eight", "8");
numMap.put("nine", "9");
int answer = 0;
// 2. 아스키코드/유니코드에서 57보다 크면 숫자가 아님.
int asciiEndNum = 57;
StringBuilder tempSb = new StringBuilder();
StringBuilder answerSb = new StringBuilder();
for(int i = 0; i < s.length(); i++) {
char letter = (s.charAt(i));
// 3. 문자열에서 숫자가 아닌 부분 찾기
if(letter > asciiEndNum) {
// 4. 한 글자씩 StringBuilder에 추가
tempSb.append(letter);
// 5. 글자수가 3자리 이상이면 맵에서 단어에 대응되는 숫자 찾기
if(tempSb.length() >= 3) {
String numStr = numMap.get(tempSb.toString());
if(numStr != null) {
// 6. 찾았으면 StringBuilder에 추가
answerSb.append(numStr);
// 7. StringBuilder 초기화
tempSb.setLength(0);
}
}
} else {
answerSb.append(letter);
}
}
answer = Integer.parseInt(answerSb.toString());
return answer;
}
}
class Solution {
final static String[] STR_ARR = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
public int solution(String s) {
int answer = 0;
for(int i = 0; i < 10; i++) {
s = s.replaceAll(STR_ARR[i], Integer.toString(i));
}
answer = Integer.parseInt(s);
return answer;
}
}
import java.util.HashMap;
import java.util.Map;
class Solution {
// 선언하면서 초기화
final static Map<String, String> NUM_MAP = new HashMap<String, String>(){{
put("zero", "0");
put("one", "1");
put("two", "2");
put("three", "3");
put("four", "4");
put("five", "5");
put("six", "6");
put("seven", "7");
put("eight", "8");
put("nine", "9");
}};
public int solution(String s) {
int answer = 0;
int asciiEndNum = 57;
StringBuilder tempSb = new StringBuilder();
StringBuilder answerSb = new StringBuilder();
for(int i = 0; i < s.length(); i++) {
char letter = (s.charAt(i));
if(letter > asciiEndNum) {
tempSb.append(letter);
// null 체크 대신 containsKey() 사용
if(tempSb.length() >= 3 && NUM_MAP.containsKey(tempSb.toString())) {
answerSb.append(NUM_MAP.get(tempSb.toString()));
tempSb.setLength(0);
}
} else {
answerSb.append(letter);
}
}
answer = Integer.parseInt(answerSb.toString());
return answer;
}
}