CodeWars 아흔 일곱 번째 문제

Updated:

parseInt() reloaded

public static int parseInt(String numStr) {
    HashMap<String, Integer> map = setNumbertoMap();

    String[] split = numStr.replaceAll(" and ", " ").replaceAll("-", " ").split(" ");
    List<Integer> list = new ArrayList<Integer>();
    int calNumber = 0;

    for(int i = 0; i < split.length; i++) {
        int number = map.get(split[i]);

        if(number == 100) {
            calNumber *= 100;
        } else if (number == 1000) {
            calNumber *= 1000;
            list.add(calNumber);
            calNumber = 0;
        } else if (number == 1000000){
            calNumber *= 1000000;
            list.add(calNumber);
            calNumber = 0;
        } else {
            calNumber += number;
        }
    }

    list.add(calNumber);

    int sum = 0;

    for(int num : list) {
        sum += num;
    }

    return sum;
}

public static HashMap<String, Integer> setNumbertoMap() {
    int[] number = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
                    20, 30, 40, 50, 60, 70, 80, 90, 100, 1000, 1000000};
    String[] digit = {"zero", "one","two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", 
                      "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", 
                      "nineteen", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety", "hundred",
                      "thousand", "million"};

    HashMap<String, Integer> map = new HashMap<String, Integer>();

    for(int i = 0; i < number.length; i++) {
        map.put(digit[i], number[i]);
    }

    return map;
}
  • 이번 문제를 통해서 드디어 1000점을 돌파 했다.
  • 영문으로 된 숫자를 아라비아 숫자로 바꾸는 문제이다.
  • 처음 풀었을 때는 중복되는 코드도 많고 굉장히 이해하기 어려운 코드로 짜써 성공했다.
  • 그러나 다시 생각해보니 더 간단하게 풀 수 있는 코드가 생각이 나서 위에 처럼 작성했다.
  • BEST 코드의 경우 수식을 무언가 쓰는데 for을 이중으로 사용해서 오히려 내 코드가 더 낫다고 생각한다.
  • 문자열을 띄어쓰기로 split하여 모두 숫자로 바꾼다. 앞에서 부터 숫자를 임의의 변수에 더해 나간다. 100이 나오면 앞에서 더한 임의의 변수에 100을 곱한다. 그리고 1000과 1000000이 나오면 각각 1000과 1000000을 곱하고 list에 넣는다. 그리고 임의의 변수를 0으로 만든다.
  • 마지막에 list에 넣는다. 숫자 1,2,3 같은 1000이하의 영문숫자가 올 수 있기 때문이다. 어차피 1000 이상은 임의의변수를 0으로 초기화 하기 때문에 리스트에 0을 넣어도 리스트의 숫자들을 다 더했을 경우 영향이 없다.
  • 즉, 숫자가 1234567이 나오면 리스트에는 1000000, 234000, 567, 0이 들어가 있다. 이를 다 더해서 출력하면 된다.