https://school.programmers.co.kr/learn/courses/30/lessons/81301
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 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 | result |
---|---|
"one4seveneight" | 1478 |
"23four5six7" | 234567 |
"2three45sixseven" | 234567 |
"123" | 123 |
class Solution {
public int solution(String s) {
String[] num_String = {"zero", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine"};
String[] num = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
StringBuilder sb = new StringBuilder(s);
//String 클래스의 matches 메소드 이용
//인자로 주어진 정규식에 매칭되는 값이 있느냐에 따라 boolean 값 반환
//정규식에서 \d 는 0~9 사이의 숫자를 의미하며 [0-9]로 쓸수도 있다
//+는 앞의 표현식이 1개 이상 있다는 의미
//주어진 문자열에 숫자만 있을때까지 while문을 반복하며
//num_String 배열의 원소와 동일한 값이 있으면 그에 맞는 숫자로 대체한다
//그리고 indexOf 메소드에서 해당 값을 찾지 못 할 경우 -1를 반환하기 때문에
//if문을 이용하여 continue를 수행 (if문이 없을시 StringIndexOutOfBoundsException)
while (!sb.toString().matches("\\d+")) {
for (int i = 0; i < num.length; i++) {
int idx = sb.indexOf(num_String[i]);
if (idx < 0) {
continue;
}
sb.replace(idx, idx + num_String[i].length(), num[i]);
}
}
return Integer.parseInt(sb.toString());
}
}
class Solution {
public int solution(String s) {
String[] strArr = {"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine"};
//주어진 문자열에 배열의 원소가 있으면 i 값을 String으로 변환해서 모두 대체한다
for (int i = 0; i < strArr.length; i++) {
s = s.replaceAll(strArr[i], Integer.toString(i));
}
return Integer.parseInt(s);
}
}
처음에는 주어진 문자열을 어떻게 숫자와 문자열로 구분해야 될지 고민이 많았는데
split()을 쓸 수도 없고..
그래서 문자열 숫자 알파벳 배열과 문자열 숫자 배열을 만든 뒤
for문을 돌려서 주어진 문자열에 배열 원소가 있을 경우 숫자로 대체하였다.
하지만 for문이라 s가 동일한 단어가 여러 개 있거나 오름차순이 아닐 경우 제대로 된 결과가 나오지 않아서
while문으로 문자열에 숫자가 없을 때까지 계속 for문을 돌리는 식으로 코드를 작성하였는데
그 과정에서 정규식 사용 방법도 알게 되고, indexOf 메소드에서 찾기를 실패할 경우 -1을 반환한다는 것도 알게 되었지만
다른 사람의 풀이를 보니까 너무 간단했다..
단지 숫자 단어 배열만 만들어둔 뒤 숫자는 for문의 i를 이용하였고
replaceAll 메소드로 모든 단어를 숫자로 대체할 수 있었다.