본문 바로가기

알고리즘/문제 풀이

99클럽 코테 스터디 3일차 TIL + Programmers 숫자 문자열과 영단어 java

1. 문제 설명

문제 링크

2. 접근 방식

KEY WORD: Brute force

  1. key=String, value=Integer인 map에 문자로 표현한 숫자 =int형 숫자로 1~9까지 모든 숫자를 저장한다.
  2. 포인터를 하나 사용하여 해당 포인터가 가르키는 값을 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);
    }
}