프로그래머스/Lv. 0(코딩테스트 입문)

[프로그래머스 코딩테스트] 영어가 싫어요(Java)

Sigfriede 2023. 4. 14. 15:18

  문제 설명

  영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 numbers가 매개변수로 주어질 때, numbers를 정수로 바꿔 return 하도록 solution 함수를 완성해주세요.

 

  제한사항

  • numbers는 소문자로만 구성되어 있습니다.
  • numbers는 "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"들이 공백 없이 조합되어 있습니다.
  • 1 <= numbers의 길이 <= 50
  • "zero"는 numbers의 맨 앞에 올 수 없습니다.

 

  입출력 예

numbers result
"onetwothreefourfivesixseveneightnine" 123456789
"onefourzerosixseven" 14067
import java.util.HashMap;
class Solution {
    public long solution(String numbers) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("zero", 0);
        map.put("one", 1);
        map.put("two", 2);
        map.put("three", 3);
        map.put("four", 4);
        map.put("five", 5);
        map.put("six", 6);
        map.put("seven", 7);
        map.put("eight", 8);
        map.put("nine", 9);
        
        for (String key: map.keySet()) {
            String value = String.valueOf(map.get(key));
            numbers = numbers.replace(key, value);
        }
        long answer = Long.parseLong(numbers);
        return answer;
    }
}

  HashMap을 생성합니다. 각 문자에 대응하는 숫자를 put으로 HashMap에 데이터를 넣어줍니다.

  for문이 map의 keySet 메소드로 KEY값을 모두 가져오면서 하나씩 key에 넣어줍니다. 마찬가지로 value 역시 map에서 key를 통해 가져온 VALUE를 value에 할당합니다. replace 메소드로 key와 value를 바꿔 numbers에 다시 할당합니다.

  numbers는 현재 문자열입니다. 따라서 long형인 answer에 할당하기 위해서는 Long형으로 변환해야 합니다. 따라서 parseLong 메소드를 사용하여 numbers를 변환한 뒤, answer에 할당했습니다.

  HashMap을 쓰지 않고 푸는 다른 방법은 for문을 사용하는 것입니다. 문자열 배열을 하나 생성하여 numbers에 들어가는 각 문자열을 zero부터 순서대로 배열에 넣어준 뒤, for문이 배열을 순회하는 방식으로 푸는 것입니다. 변환은 마찬가지로 replace를 사용할 수 있겠습니다.

 

  유사한 다른 문제

  [프로그래머스 코딩테스트] 숫자 문자열과 영단어(Java)

  https://sigfriede.tistory.com/80