1. 문제
프로그래머스 - 숫자 문자열과 영단어
- 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어졌을 때, s가 의미하는 원래 숫자를 반환하는 문제("one4seveneight" -> 1478)
- 숫자의 일부 자릿수를 영단어로 바꾸는 예시
- 1478 → "one4seveneight"
- 234567 → "23four5six7"
- 10203 → "1zerotwozero3"
2. 초기 풀이
- 영단어와 그에 해당하는 숫자를 저장한 Map을 활용하는 방식
- s에서 숫자와 영단어를 추출하여, 숫자는 그대로 result에 붙이고, 영단어는 숫자로 변환하여 붙이는 방식으로 해결
import java.util.Map;
class Solution {
public int solution(String s) {
String result = "";
Map<String, Integer> map = Map.of(
"zero", 0,
"one", 1,
"two", 2,
"three", 3,
"four", 4,
"five", 5,
"six", 6,
"seven", 7,
"eight", 8,
"nine", 9
);
String word = "";
for (char c : s.toCharArray()) {
if (Character.isDigit(c)) {
result += c;
} else {
word += c;
if (map.containsKey(word)) {
result += map.get(word);
word = "";
}
}
}
return Integer.parseInt(result);
}
}
3. 개선 풀이
- 문자열 배열과 인덱스를 활용하는 방식
- 조금 덜 직관적이지만 더 간결하다.
class Solution {
public int solution(String s) {
String[] words =
{"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
for (int i = 0; i < words.length; i++) {
s = s.replace(words[i], String.valueOf(i));
}
return Integer.parseInt(s);
}
}