GitHub 자세히보기

Algorithm/Programmers

[Programmers] 숫자 문자열과 영단어 for JAVA - Map vs String

devdange 2022. 3. 17. 01:14

문제 바로가기

 

코딩테스트 연습 - 숫자 문자열과 영단어

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

programmers.co.kr

 

문제풀이

숫자와 영단어를 대응시켜야한다는 관점에서 저는 Map을 사용했습니다.

하지만 대부분의 문제후기를 보면 String의 replaceAll() 메소드를 사용하신 것을 확인할 수 있습니다.

두가지 풀이에 대해 살펴보겠습니다.

 

1. Map 적용

숫자의 일부 자릿수를 영단어로 바꾸는 문제이다. 
숫자에 대응하는 영단어를 Map에 저장한다. 
이를 사용하여 for문을 돌며 영단어를 숫자로 변환한다.

 

구현

1. 단어-영단어를 Map 에 초기화
2. 입력된 문자열 s를 한자리를 for문을 돈다 
2-1. 숫자일 경우, 결과에 append함 
2-2. 영어일 경우, 입력된 값이 map에 있는지 확인한다. 만약 map에 존재한다면 그에 대응하는 숫자를 결과에 append 함 
3. 결과 출력
import java.util.HashMap;
import java.util.Map;

class Solution {
	
    public int solution(String s) {
        StringBuilder sb = new StringBuilder();
        
        Map<String, Integer> numberMap = new HashMap<String, Integer>();
        String[] number = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    	
        for(int n = 0; n < 10; n++) {
			numberMap.put(number[n], n);
		}

        StringBuilder tmp = new StringBuilder();
        for(char c : s.toCharArray()) {
        	if(c >= '0' && c <= '9') {
        		sb.append(c);
        	} else {
        		tmp.append(c);
        		if(numberMap.containsKey(tmp.toString())) {
        			sb.append(numberMap.get(tmp.toString()));
        			tmp = new StringBuilder();
        		}
        	}
        }
        int answer = Integer.parseInt(sb.toString());
        return answer;
    }
}

실행결과

 

2. String replaceAll 적용

다른사람들의 풀이에서 확인할 수 있었던 방법으로 replaceAll을 적용한다.

 

구현 

1. String 배열을 영단어로 초기화한다.
2. 숫자가 있는 배열을 반복하며 replaceAll 을 활용하여 영단어는 숫자로 변환한다.
3.결과 출력
class Solution {
	public static int solution(String s) {
		String[] number = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };

		for (int n = 0; n < 10; n++) {
			s = s.replaceAll(number[n], Integer.toString(n));
		}

		int answer = Integer.parseInt(s);
		return answer;
	}
}

실행결과

 

마치며

숫자와 영단어의 대응관게를 어떻게 적용하면 좋을지 많은 고민을 했는데 contains를 효율적으로 사용할 수 있는 Map 자료구조를 적용하였다. replaceAll을 적용하면 코드는 단순해지지만 실행시간이 확연하게 증가하는 것을 확인할 수 있다. 코드가 짧다고 무조건 좋은건 아니다..!