코테 스터디 4일차에 이 문제가 나오다니.. 정말 대과거에 첫 취준을 했을시절 도전했었던 문제다ㅠㅠㅋㅋㅋㅋ 심지어 깃헙에 올렸어야 됐었나? 그랬던 것 같은데 잘 기억은 나지 않는다.
HashMap 써서 일단 숫자랑 영어 담아놓고 맞는 단어 하나씩 숫자로 변환해 나가면서 풀어보자 했는데 결국 못풀었었다.
지금 다시 공부해보니 풀리긴 풀린다. 정말 다행이게도 😂
주어진 문자열에서 영어단어로 표현된 숫자들을 실제 문자로 변환해야한다.
import java.util.*;
class Solution {
public int solution(String s) {
HashMap<String, Integer> map = new HashMap<>();
// 영어 숫자 단어와 실제 숫자 매핑
map.put("zero", 0);
map.put("one", 1);
map.put("two", 2);
map.put("three", 3);
map.put("four", 4);
map.put("five", 5);
map.put("six", 6);
map.put("seven", 7);
map.put("eight", 8);
map.put("nine", 9);
StringBuilder result = new StringBuilder();
StringBuilder tmp = new StringBuilder();
for (char c : s.toCharArray()) {
// 숫자일 때
if (Character.isDigit(c)) {
result.append(c);
tmp.setLength(0); // 임시 문자열 초기화
} else {
// 영어일 때
tmp.append(c);
String tmpWord = tmp.toString();
// 단어가 완성되면 변환하여 추가
if (map.containsKey(tmpWord)) {
result.append(map.get(tmpWord));
tmp.setLength(0); // 임시 문자열 초기화
}
}
}
return Integer.parseInt(result.toString());
}
}
✅계속해서 답이 틀리게 나와서 뭐지?????? 했는데 잘 보니 숫자일 때 result에 바로 담고 tmp를 초기화를 하지 않았더라.. 😅
임시 문자열 변수 tmp는 영어단어나, 숫자가 완성 될 때 즉, result에 값을 추가하는 시점에 바로바로 초기화를 해줘야한다.
class Solution {
public int solution(String s) {
String[] strArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
for(int i = 0; i < strArr.length; i++) {
s = s.replaceAll(strArr[i], Integer.toString(i));
}
return Integer.parseInt(s);
}
}
생각해보니 배열에 그냥 쭉 저장하면 됐는데.. 왜 이렇게 어렵게 돌아갔을까? 배열에 인덱스가 있다는 사실을 까맣게 잊고있었다ㅋㅋㅋㅋ 역시 기초가 제일 중요하다.
replaceAll 메서드를 통해 한 번의 순회로 문자열 변환을 완료할 수 있어 코드가 훨씬 효율적이고 간단했다.
다른 사람의 풀이를 보면 이렇게 내가 생각하지 않았던 방향으로 새로운 해답을 찾을 수 있어 좋다.