문제 바로가기
문제풀이
숫자와 영단어를 대응시켜야한다는 관점에서 저는 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을 적용하면 코드는 단순해지지만 실행시간이 확연하게 증가하는 것을 확인할 수 있다. 코드가 짧다고 무조건 좋은건 아니다..!
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] 124 나라의 숫자 for JAVA (2) | 2022.03.17 |
---|---|
[프로그래머스] k진수에서 소수 개수 구하기 for JAVA (0) | 2022.01.19 |
[프로그래머스] 신고 결과 받기 for Java - HashMap 를 적용한 풀이 (0) | 2022.01.17 |
[프로그래머스] 쿼드압축 후 개수 세기 for JAVA 분할정복 (0) | 2022.01.05 |
[프로그래머스] 이진 변환 반복하기 for JAVA (0) | 2022.01.04 |