문제 설명
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
숫자 | 영단어 |
---|---|
0 | zero |
1 | one |
2 | two |
3 | three |
4 | four |
5 | five |
6 | six |
7 | seven |
8 | eight |
9 | nine |
입출력 예
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
String res = "";
String[] num = new String[]{"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
List<String> list = Arrays.asList(num);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < s.length(); i++) {
boolean isNum = Character.isDigit(s.charAt(i));
if(isNum) {
res += s.charAt(i);
} else {
sb.append(s.charAt(i));
if(list.contains(sb.toString())) {
res += list.indexOf(sb.toString());
sb.setLength(0);
}
}
}
answer = Integer.parseInt(res);
return answer;
}
}
s
를 돌며 boolean isNum
이 참일 경우(=i번째 문자가 숫자일 경우) res
에 담아둔다.sb
에 글자를 담는다. sb
문자열이 알파벳 리스트 list
에 있을만큼 채워졌을 때, list
에 sb
와 같은 문자열이 있는 인덱스를 결과값에 담는다. 그리고 sb
를 초기화해준다.막혔던 부분은 boolean의 else
케이스가 작동이 안 돼서 코드 실행시 자꾸 숫자만 담아졌던 것이다.
if(list.contains(sb)) {
res += list.indexOf(sb);
sb.setLength(0);
}
list.contains()
메서드에서 원래는 이렇게 작성했었는데, sb
를 포함하는지 검사가 통과되지 않으니까 인덱스도 안 담기는 것이라는 생각이 들었다.
contains
boolean contains(Object o)
Returns true if this list contains the specified element.
공식문서와 스택오버플로우 디깅을 좀 해보니,
if(list.contains(sb.toString())) {
res += list.indexOf(sb.toString());
sb.setLength(0);
}
toString()
을 해줬더니 코드가 정상적으로 실행되고, 테스트가 통과되었다. 굉장히 기초적인 부분에서 막혀서 답답했지만, 이 부분은 이제 까먹지 않을 것 같다👍