[프로그래머스] 파트2.4장 문자열 - 숫자 문자열과 영단어

은지일·2023년 9월 17일
0

알고리즘

목록 보기
15/17
post-thumbnail

1. 문제

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

  • 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어졌을 때, s가 의미하는 원래 숫자를 반환하는 문제("one4seveneight" -> 1478)
  • 숫자의 일부 자릿수를 영단어로 바꾸는 예시
    - 1478 → "one4seveneight"
    - 234567 → "23four5six7"
    - 10203 → "1zerotwozero3"

2. 초기 풀이

  • 영단어와 그에 해당하는 숫자를 저장한 Map을 활용하는 방식
  • s에서 숫자와 영단어를 추출하여, 숫자는 그대로 result에 붙이고, 영단어는 숫자로 변환하여 붙이는 방식으로 해결
import java.util.Map;

class Solution {
    public int solution(String s) {
        // s의 숫자는 그대로, 영단어는 숫자로 변환하여 조립할 result
        String result = "";
        
        // 영단어를 key, 숫자를 value로 저장할 map
        // 0에서 9까지 영단어와 숫자를 map에 저장
        Map<String, Integer> map = Map.of(
            "zero", 0,
            "one", 1,
            "two", 2,
            "three", 3,
            "four", 4,
            "five", 5,
            "six", 6,
            "seven", 7,
            "eight", 8,
            "nine", 9
        );
        
        // 단어 하나씩 조립할 word ex) "" -> "z" -> "ze" -> "zer" -> "zero" -> ""
        String word = "";
        
        // 문자열 s를 char 배열로 만들어 순회
        for (char c : s.toCharArray()) {
            // 해당 단어가 숫자라면
            if (Character.isDigit(c)) {
                result += c; // 바로 result에 조립
            } else { // 해당 단어가 영문자라면
                // word에 조립
                word += c;
                // 조립한 word가 zero, one과 같이 map의 key가 된다면
                if (map.containsKey(word)) {
                    // 해당 word를 key로 하는 value를 result에 조립
                    result += map.get(word);
                    // word 초기화 
                    word = "";
                }
            } 
        }
            
        // 조립한 result를 int 타입으로 변환하여 리턴
        return Integer.parseInt(result);
    }
}

3. 개선 풀이

  • 문자열 배열과 인덱스를 활용하는 방식
  • 조금 덜 직관적이지만 더 간결하다.
class Solution {
    public int solution(String s) {
        // 0에서 9까지 영단어를 배열로 등록
        String[] words = 
        {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
        
        // 해당 배열을 순회하면서 s의 영단어를 숫자로 변환
        for (int i = 0; i < words.length; i++) {
            // 인덱스를 활용하여 zero -> 0, one -> 1과 같이 교체
            s = s.replace(words[i], String.valueOf(i));
        }
        
        // int 타입으로 변환하여 리턴
        return Integer.parseInt(s);
    }
}
profile
항상 더 나은 방법을 찾는 백엔드 개발자 은지일입니다 :)

0개의 댓글