본문 바로가기

코딩테스트/Programmers

[JAVA] 숫자 문자열과 영단어

< 내 풀이 >

import java.util.*;
class Solution {
    public int solution(String s) {
        HashMap<String,Integer> map=new HashMap<>();
        String arr[]={"zero","one","two","three","four","five",
                      "six","seven","eight","nine"};
        for(int i=0;i<10;i++){
            map.put(arr[i],i); //map 에 저장
        }
        
        for(String key:map.keySet()){
            if(s.contains(key))
             s=s.replace(key,Integer.toString(map.get(key)));
        }
        
        int answer = Integer.parseInt(s);
        return answer;
    }
}

 

✏️ 풀이 과정

 

1. 해시맵에 배열 arr 의 값을 key로, 0~9까지의 값을 value로 하여 저장한다.

2. 해시맵을 순회하며 문자열 s가 key를 포함하고 있으면 해당 값을 map의 key를 통해 얻은 값으로 변경한다.

=> 주의할 점: s는 문자열이므로 문자열 key를 바로 int형인 value로 바꾸지 못한다. String 형으로 변환하여 값을 전달해야한다.

3. 문자열 s를 int형으로 변환하여 answer에 저장한 후 반환한다. 

 

< 다른 사람의 풀이 >

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);
    }
}

➡️ 실행 시간은 내 코드가 더 짧게 나오긴 하지만, 위의 풀이가 더 간단해 보이긴 한다.

 

✍🏻 느낀점

 

프로그래머스 문제를 풀면서, 해시맵에 익숙해진 것 같다. 하지만 익숙해지면서, key-value 형태가 나오면 무조건 해시맵으로 풀려는 경향이 있다. 위의 풀이를 보면서 이렇게 간단하게 풀 수 있구나 싶어서 놀랐다. 이번 문제를 통해 replace 함수를 사용할 때 문자열의 값을 냅다 다른 타입으로 변환할 수 없다는 걸 새롭게 배웠다.