숫자 문자열과 영단어

HeeSeong·2021년 7월 20일
0

프로그래머스

목록 보기
81/97
post-thumbnail

🔗 문제 링크

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


❔ 문제 설명


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

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

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

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


⚠️ 제한사항


  • 1 ≤ s의 길이 ≤ 50

  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.

  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.



💡 풀이 (언어 : Java)


숫자를 나타내는 영단어가 어디서부터 어디까지인지 인식하는 방법이 뭘까 고민을 했다. 저장한 영단어들을 조회할 때 시간복잡도를 줄여주기 위해서 HashMap을 사용했다. 만족하는 영단어의 최소 글자수가 3개이므로 임시 문자열이 3개 이상일 때부터 HashMap에서 임시 문자열과 일치하는 단어가 나오는지 계속 체킹하고, 찾으면 정답 문자열에 넣어주고 임시 문자열을 초기화하는 알고리즘이다.

import java.io.IOException;
import java.util.HashMap;

class Solution {
    public int solution(String s) {
        StringBuilder answer = new StringBuilder();
        char[] input = s.toCharArray();
        // 숫자와 영단어로 HashMap 만들기
        HashMap<String, Character> map = new HashMap<String, Character>() {{
            put("zero", '0');
            put("one", '1');
            put("two", '2');
            put("three", '3');
            put("four", '4');
            put("five", '5');
            put("six", '6');
            put("seven", '7');
            put("eight", '8');
            put("nine", '9');
        }};
        // 영어 단어를 만들기 위한 임시 문자열
        StringBuilder sb = new StringBuilder();
        for (Character ch : input) {
            // 문자가 알파벳일 경우
            if (!Character.isDigit(ch)) {
                // 임시 문자열에 넣는다
                sb.append(ch);
                // 임시 문자열의 길이가 3이상 쌓이면 단어 충족하는지 체킹
                if (sb.length() >= 3) {
                    // 글자가 모자라면 map에서 null 반환,충분하면 해당 숫자 문자 반환
                    Character num = map.get(sb.toString());
                    // 숫자 문자가 반환되면 정답 문자열에 붙여주고, 임시 문자열 초기화
                    if (num != null) {
                        answer.append(num);
                        sb.setLength(0);
                    }
                }
            }
            // 문자가 숫자일 경우 정답 문자열에 그대로 붙인다
            else
                answer.append(ch);
        }
        // 정답 문자열을 정수 타입으로 변환
        return Integer.parseInt(answer.toString());
    }
}
profile
끊임없이 성장하고 싶은 개발자

0개의 댓글