[알고리즘] - 숫자문자열과 영단어(프로그래머스)

이창희·2023년 2월 6일
0

알고리즘

목록 보기
6/7

문제


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

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

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

제한사항


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

입출력 예시


sresult
"one4seveneight"1478
"23four5six7"234567
"2three45sixseven"234567
"123"123

제한시간


  • 정확성 테스트 : 10초

풀이


내가 푼 방법

문제를 보고 Map을 써야 겠다 생각해서 Map에 문자열로된 숫자와 영문을 집어넣고 문자열을 돌면서 해당 영어단어가 Map에 존재하면 키값으로 변경해서 넣는 방법을 썻다.

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int solution(String s) {
        int answer = 0;

        // map으로 정리하기
        Map<String,String> 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");

        StringBuilder result = new StringBuilder();
        StringBuilder word = new StringBuilder();

        for (int i = 0; i <s.length() ; i++) {
            word.append(s.charAt(i));
            if(map.containsKey(String.valueOf(word))){
                result.append(map.get(String.valueOf(word)));
                word.setLength(0);
            }else if(s.charAt(i)>='0' && s.charAt(i)<='9'){
                result.append(s.charAt(i));
                word.setLength(0);
            }
        }

        answer = Integer.valueOf(String.valueOf(result));

        return answer;
    }
}

다른 방법의 풀이 (replaceAll)


String 내장함수인 replaceAll을 이용한 풀이법이다.
역시 세상에는 더더욱 나은 코드가 존재한다...

   public int solution1(String s) {
        String[] digits = {"0","1","2","3","4","5","6","7","8","9"};
        String[] alphabets = {"zero","one","two","three","four","five","six","seven","eight","nine"};

        for(int i=0; i<10; i++){
            s = s.replaceAll(alphabets[i],digits[i]);
        }

        return Integer.parseInt(s);
    }

replaceAll

replaceAll은 Java의 String 클래스에서 제공하는 메서드입니다. replaceAll 메서드는 문자열에서 일치하는 모든 부분을 새로운 문자열로 대체하는 기능을 제공합니다. 일치하는 부분은 정규식(regular expression)으로 지정할 수 있습니다.

예를 들어, 다음 코드는 "Hello, world!" 문자열에서 모든 쉼표(,)를 점(.)으로 대체합니다.

String str = "Hello, world!";
str = str.replaceAll(",", ".");
// 결과 :  Hello. world!";
profile
백앤드 개발자를 꿈꾸는 개발자 지망생입니다.

0개의 댓글