프로그래머스 레벨 1 - 숫자 문자열과 영단어

dev-mage·2022년 9월 13일
0
post-thumbnail
post-custom-banner

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

문제 설명

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

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

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

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

숫자영단어
0zero
1one
2two
3three
4four
5five
6six
7seven
8eight
9nine

제한사항

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

풀이 1)

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

class Solution {
    public int solution(String s) {
				// 1. 영단어:숫자 맵 생성
        Map<String, String> numMap = new HashMap<>();
        numMap.put("zero", "0");
        numMap.put("one", "1");
        numMap.put("two", "2");
        numMap.put("three", "3");
        numMap.put("four", "4");
        numMap.put("five", "5");
        numMap.put("six", "6");
        numMap.put("seven", "7");
        numMap.put("eight", "8");
        numMap.put("nine", "9");

        int answer = 0;
				
				// 2. 아스키코드/유니코드에서 57보다 크면 숫자가 아님.
        int asciiEndNum = 57;

        StringBuilder tempSb = new StringBuilder();
        StringBuilder answerSb = new StringBuilder();

        for(int i = 0; i < s.length(); i++) {
            char letter = (s.charAt(i));
						// 3. 문자열에서 숫자가 아닌 부분 찾기
            if(letter > asciiEndNum) {
								// 4. 한 글자씩 StringBuilder에 추가 
                tempSb.append(letter);
								
								// 5. 글자수가 3자리 이상이면 맵에서 단어에 대응되는 숫자 찾기
                if(tempSb.length() >= 3) {
                    String numStr = numMap.get(tempSb.toString());
                    if(numStr != null) {
												// 6. 찾았으면 StringBuilder에 추가
                        answerSb.append(numStr);
												// 7. StringBuilder 초기화
                        tempSb.setLength(0);
                    }
                }
            } else {
                answerSb.append(letter);
            }
        }
        answer = Integer.parseInt(answerSb.toString());
        return answer;
    }
}

리뷰

1

풀이2)

class Solution {
    final static String[] STR_ARR = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

    public int solution(String s) {
        int answer = 0;
        for(int i = 0; i < 10; i++) {
            s = s.replaceAll(STR_ARR[i], Integer.toString(i));
        }
        answer = Integer.parseInt(s);
        return answer;
    }
}

리뷰

  • 다른 사람의 풀이 중 String 배열과 replaceAll()을 이용한 간결한 코드가 있길래 적용해봄
  • 속도가 내 풀이보다 느린데 아마 String 결합 연산의 속도 때문인 것 같다.
    2

풀이3)

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

class Solution {
		// 선언하면서 초기화
    final static Map<String, String> NUM_MAP = new HashMap<String, String>(){{
        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");
    }};

    public int solution(String s) {
        int answer = 0;
        int asciiEndNum = 57;

        StringBuilder tempSb = new StringBuilder();
        StringBuilder answerSb = new StringBuilder();

        for(int i = 0; i < s.length(); i++) {
            char letter = (s.charAt(i));
            if(letter > asciiEndNum) {
                tempSb.append(letter);
								// null 체크 대신 containsKey() 사용
                if(tempSb.length() >= 3 && NUM_MAP.containsKey(tempSb.toString())) {
                    answerSb.append(NUM_MAP.get(tempSb.toString()));
                    tempSb.setLength(0);
                }
            } else {
                answerSb.append(letter);
            }
        }
        answer = Integer.parseInt(answerSb.toString());
        return answer;
    }
}

리뷰

  • 기존에 나의 풀이에서 Map을 static final로 선언하고 바로 초기화 시킨 후 null 체크 대신 containsKey()를 사용.
  • 전체적으로 속도가 전보다 미세하지만 빨라짐.
    3
post-custom-banner

0개의 댓글