Programmers Lv1 숫자 문자열과 영단어

이지수·2022년 4월 24일
0

코딩테스트

목록 보기
1/2
post-thumbnail
post-custom-banner

문제

문자열을 입력받아서 숫자로 변환
문자열을 앞에서 한글자씩 잘라서 숫자랑 매칭되면 바꾸면 되겠네!?
String을 length로 for문으로 index로 substring 하면서 난리부루스를 치려다가 귀찮고 짜증나서 Queue에 넣고 다시 빼야지로 결정

정보

입출력

Inputoutput
one4seveneight1478
23four5six7234567
2three45sixseven234567
123123

구현

아이디어

  1. Map에다가 스트링, 숫자 매핑을 모두 넣는다. (1=1, one=1, two=2, 2=2,...)
  2. 입력받은 스트링을 잘라서 Queue에 넣는다.
  3. Queue에서 하나씩 꺼내면서
    • Map에 있으면 결과(result)에 포함
    • Map에 없으면 Queue에서 다음글자 꺼내서 다시 검사

소스코드

전체소스: https://github.com/lee-jisoo/algorithm-study/blob/master/src/com/ljs/study/programers/Programmers01.java

public class Programmers01 {

    public static HashMap<String, String> map;

    public static void main(String args[]) {
        initMap();
        System.out.println(convert("one4seveneight"));
        System.out.println(convert("23four5six7"));
        System.out.println(convert("2three45sixseven"));
        System.out.println(convert("123"));
    }

    private static void initMap() {
        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");
        map.put("0", "0");
        map.put("1", "1");
        map.put("2", "2");
        map.put("3", "3");
        map.put("4", "4");
        map.put("5", "5");
        map.put("6", "6");
        map.put("7", "7");
        map.put("8", "8");
        map.put("9", "9");
    }

    public static String convert(String input) {
        String[] arr = input.split("");
        Queue<String> queue = new LinkedList<>(List.of(arr));

        String result = "";
        String key = "";
        while (!queue.isEmpty()) {
            key += queue.poll();
            if (map.containsKey(key)) {
                result += map.get(key);
                key = "";
            }
        }

        return result;
    }

}

결과확인

1478
234567
234567
123

여담

다른 사람 풀이보니까 대부분 replace 를 loop돌려서 해결한 것 같은데,
나는 쓸데없이 좀 복잡하게 처리 한 것 같다.

추천이 많았던 베스트 솔루션

class Solution {
    public int solution(String s) {
        String[] strArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
        for(int i = 0; i < strArr.length; i++) {
            s = s.replaceAll(strArr[i], Integer.toString(i));
        }
        return Integer.parseInt(s);
    }
}
profile
공부합시다
post-custom-banner

0개의 댓글