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);
}
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
99클럽 코테 스터디 4일차 TIL + Programmers 문자열 압축 (0) | 2024.07.25 |
---|---|
[백준] 1806 부분합 풀이 java (0) | 2024.07.24 |
[백준] 1300 K번째 수 java 이해하기 쉬운 풀이^^ 🌟 (0) | 2024.07.24 |
[프로그래머스] 광물 캐기 풀이 java (0) | 2024.07.23 |
[백준] 2075 N번째 큰 수 java 풀이 (풀이 2개) (0) | 2024.07.23 |