문제 설명
주어진 문자열 numbers는 “zero”, “one”, “two”, “three”, “four”, “five”, “six”, “seven”, “eight”, “nine”로 구성된 소문자 영단어들이 공백 없이 나열되어 있습니다. 이 문자열을 실제 숫자로 변환하는 문제를 해결하려고 합니다.
문제 조건
• numbers는 소문자로만 구성됩니다.
• “zero”는 맨 앞에 올 수 없습니다.
• 문자열의 길이 1 ≤ numbers의 길이 ≤ 50 입니다.
문제 해결 전략
숫자 영단어를 실제 숫자로 변환하는 문제!! 해결 전략은 아래와 같다.
1. 해시맵 또는 리스트로 영단어와 숫자 매핑:
• “zero”부터 “nine”까지의 영단어를 리스트에 저장하고, 이들을 각각 0부터 9까지의 숫자로 매핑
2. replace()를 사용하여 문자열 대체:
• 문자열 numbers에서 각 영단어를 찾아 그에 해당하는 숫자로 변환
• 문자열 대체를 위해 자바의 replace() 메서드를 사용하여 각 영단어를 대응하는 숫자로 변환
3. 최종적으로 숫자로 변환:
• 변환된 문자열을 Long.parseLong()을 사용해 long 타입의 숫자로 변환
여기 내 소스에 사용한 건 일단 ArrayList이다. HashMap을 사용해볼까도 했는데...
애초에 영어 -> 숫자로 바꾸는거니 ArrayList를 이용해서 index를 그대로 가져다 쓰면 괜찮을 것 같다는 생각이 들었다.
import java.util.*;
class Solution {
public long solution(String numbers) {
long answer = 0;
// 숫자 영단어를 리스트에 저장
List<String> arrayList = new ArrayList<>();
arrayList.add("zero");
arrayList.add("one");
arrayList.add("two");
arrayList.add("three");
arrayList.add("four");
arrayList.add("five");
arrayList.add("six");
arrayList.add("seven");
arrayList.add("eight");
arrayList.add("nine");
// 영단어를 숫자로 변환
for(int i = 0; i < arrayList.size(); i++) {
numbers = numbers.replace(arrayList.get(i), Integer.toString(i));
}
// 변환된 숫자를 long으로 변환하여 반환
return Long.parseLong(numbers);
}
}
코드 설명
1. 리스트 초기화:
• "zero"부터 "nine"까지의 숫자 영단어를 List<String>에 저장
2. replace() 메서드 사용:
• numbers 문자열에서 영단어를 숫자로 대체
3. Long.parseLong()으로 숫자 변환:
• 최종적으로 변환된 문자열을 Long.parseLong(numbers)를 통해 long 타입으로 변환해 반환
-> 가끔 아예 반환형을 바꿔서 제출해도 인정되는 사이트가 있던데.. 코테 풀 때 그렇게 풀어도 되는지는 모르겠다.