본문 바로가기
코딩테스트/자바 Level 1

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

by onggury 2023. 8. 4.

문제

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

 

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

  • 1478 → "one4seveneight"
  • 234567 → "23four5six7"
  • 10203 → "1zerotwozero3"

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

 

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

 

 

제한사항

  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

 

 

import java.util.HashMap;

class Solution {
    public int solution(String s) {
    
        StringBuilder num = new StringBuilder();
        StringBuilder numStr = new StringBuilder();
        
        HashMap<String, Integer> numMap = new HashMap<String, Integer>();
        numMap.put("zero", 0); numMap.put("one", 1);
        numMap.put("two", 2); numMap.put("three", 3);
        numMap.put("four", 4); numMap.put("five", 5);
        numMap.put("six", 6); numMap.put("seven", 7);
        numMap.put("eight", 8); numMap.put("nine", 9);
        
        for(int i = 0; i < s.length(); i++) {
            if(!s.substring(i, i+1).matches("[0-9]")) {
                numStr.append(s.charAt(i));
                
                if(numMap.get(numStr.toString()) != null) {
                    num.append(numMap.get(numStr.toString()));
                    numStr.setLength(0);
                }
            }
            else {
                num.append(s.charAt(i));
            }
        }
        
        return Integer.parseInt(num.toString());
    }
}

나는 hashMap을 사용해서 먼저 초기값을 세팅해둔 뒤, 문자열로 해당 key값이 완성되면 해당 값을 넣는 식으로 해결했다.

 

그리고 결과값은 아래와 같이 나왔다.

 

뭔가 빙 돌아가는 느낌을 받았는데 역시나 아래와 같은 방법도 존재했다.

import java.util.HashMap;

class Solution {
    public int solution(String s) {
        String[] numStrArr = {"zero", "one", "two", "three", "four", 
                              "five", "six", "seven", "eight", "nine"};
        
        for(int i = 0; i <= 9; i++) {
            s = s.replaceAll(numStrArr[i], Integer.toString(i));
        }
        
        return Integer.parseInt(s);
    }
}

어떤게 더 효율적이냐 따지기는 어려워보이지만, 그래도 아래와 같이 인덱스와 replaceAll 메서드를 활용하는 방법은 좋은 방법인듯 했다.

 

 

 

출처

https://school.programmers.co.kr/learn/courses/30/lessons/81301