1. 문제 설명
2. 접근 방식
KEY WORD: Brute force
- key=String, value=Integer인 map에
문자로 표현한 숫자=int형 숫자로 1~9까지 모든 숫자를 저장한다. - 포인터를 하나 사용하여 해당 포인터가 가르키는 값을
word란 StringBuilder에 저장한다.
(1) word의 길이가 3이상이면 map에 해당 값을 key로 가지는 값이 있나 계속 확인
(2) 있으면 해당 수를 숫자로 바꾸어 답변이 되는 ans에 저장하고 word를 비운다.
(3) 없으면 포인터를 한 칸 이동하여 word를 또 채운다.
(4) 만약 숫자라면 ans에 값 저장하고 바로 건너 뛰기.
3. 코드 분석
import java.io.*;
import java.util.*;
class Solution {
static HashMap<String, Integer> map = new HashMap<>();
// 1. map에 값을 저장
// 2. 투 포인터 사용
// 2-1. right 옮겨서 left와의 차가 3글자 이상 되면 Map에 값이 있는지 계속 확인
// 2-2. 있으면 해당 수를 숫자로 옮기고, left를 right 쪽으로 땡겨서 0에서 시작
// 2-3. 없으면 한 칸 늘려서 또 map 들여다보고 확인
// 2-5. 만약 숫자라면 그냥 건너 뛰기
public int solution(String s) {
map.put("zero", 0); map.put("five", 5);
map.put("one", 1); map.put("six", 6);
map.put("two", 2); map.put("seven",7);
map.put("three",3); map.put("eight",8);
map.put("four", 4); map.put("nine", 9);
StringBuilder ans = new StringBuilder();
StringBuilder word = new StringBuilder();
int right= 0;
while(right < s.length()){
char now = s.charAt(right++);
if(now - 48 < 10){
ans.append(now);
continue;
}
word.append(now);
if(word.toString().length() >= 3){
int convert = map.getOrDefault(word.toString(), -1);
if(convert == -1) continue;
else{
ans.append(convert);
word.setLength(0);
}
}
}
return Integer.parseInt(ans.toString());
}
}
4. 성장 하기
String.replaceAll("대상값", "변경값")을 이용해 한 번에 바꾸는 풀이가 더 깔끔한 것 같다. String의 내장 매소드인 replaceAll(a,b)는 String 내부의 a를 모두 b로 변경해준다. String.replace(A,B)와의 차이점은 그냥 replaceAll은 replace와 달리 정규 표현식 또한 알아 듣는다는 것이다. 예를 들어보자.
String sample = "aaabbbcccabcddddabcdeee";
String result_1 = sample.replace("abc", "왕");
String result_2 = sample.replaceAll("[abc]", "왕");
System.out.println("replace로 변경한 값: "+ result_1);
System.out.println("replaceAll로 변경한 값: "+ result_2);
// *출력
// replace로 변경한 값: aaabbbcccc왕dddd왕deeee
// replaceAll로 변경한 값: 왕왕왕왕왕왕왕왕왕왕왕왕왕dddd왕왕왕deeee
[ ]라는 정규 표현식은 or와 같다. a이거나, b이거나, c이면 전부 "왕"으로 바꾸라는 소리이다.
5. 다른 풀이
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);
}
}
0