[알고리즘] 숫자 문자열과 영단어

coldrice99·2024년 8월 29일
0

문제 소개

문제는 다음과 같다:

주어진 문자열에서 숫자가 일부 영단어로 표현되어 있다. 이 문자열을 숫자 문자열로 변환해야 한다. 예를 들어, "one4seveneight""1478"로 변환된다.

예제 입력과 출력은 다음과 같다:

  • 입력: "one4seveneight"
  • 출력: 1478

이 문제를 풀기 위해 Java의 Map 자료구조를 사용했다. Map을 사용하면 영단어와 숫자 간의 매핑을 쉽게 관리할 수 있기 때문에 이 문제를 풀기에 적합한 도구였다.

Map.Entryreplace() 메서드를 사용한 해결

처음에는 Map.Entry, getKey(), getValue() 메서드의 사용 방법이 익숙하지 않아 약간의 혼란이 있었다. 그래서 이 메서드들을 이해하고 활용하는 방법을 중심으로 문제를 풀어보았다.

MapMap.Entry

Map은 키와 값을 쌍으로 저장하는 자료구조이다. 이 문제에서는 각 영단어를 키로, 그에 대응하는 숫자를 값으로 사용했다. Map.EntryMap에 저장된 각각의 키-값 쌍을 나타낸다. Map을 순회하면서 각 영단어를 찾아 숫자로 변환하기 위해 Map.Entry를 사용했다.

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

public class NumberWordConverter {

    public static int solution(String s) {
        // 영단어와 대응되는 숫자를 매핑하기 위한 딕셔너리 생성
        Map<String, String> numberWords = new HashMap<>();
        numberWords.put("zero", "0");
        numberWords.put("one", "1");
        numberWords.put("two", "2");
        numberWords.put("three", "3");
        numberWords.put("four", "4");
        numberWords.put("five", "5");
        numberWords.put("six", "6");
        numberWords.put("seven", "7");
        numberWords.put("eight", "8");
        numberWords.put("nine", "9");

        // 딕셔너리의 각 엔트리를 순회하면서 문자열 내의 영단어를 대응되는 숫자로 변환
        for (Map.Entry<String, String> entry : numberWords.entrySet()) {
            s = s.replace(entry.getKey(), entry.getValue());
        }

        // 변환된 문자열을 정수로 변환하여 반환
        return Integer.parseInt(s);
    }

    public static void main(String[] args) {
        // 테스트 케이스
        System.out.println(solution("one4seveneight")); // 예상 출력: 1478
        System.out.println(solution("23four5six7"));    // 예상 출력: 234567
        System.out.println(solution("2three45sixseven")); // 예상 출력: 234567
        System.out.println(solution("123"));           // 예상 출력: 123
    }
}

getKey()getValue()

Map.Entry를 사용하면 getKey()getValue() 메서드를 통해 키와 값에 접근할 수 있다. 이 메서드들은 각 영단어와 그에 대응하는 숫자를 가져오는 데 사용된다.

  • getKey(): Map.Entry에서 현재 엔트리의 키를 반환한다. 여기서는 영단어가 반환된다.
  • getValue(): Map.Entry에서 현재 엔트리의 값을 반환한다. 여기서는 해당 영단어에 대응되는 숫자가 반환된다.

이 메서드들을 활용하여 replace() 메서드를 사용해 문자열에서 영단어를 숫자로 변환할 수 있었다.

replace() 메서드

replace() 메서드는 문자열 내에서 특정 부분을 다른 문자열로 대체하는 데 사용된다. 이 문제에서는 각 영단어를 그에 대응하는 숫자로 변환하기 위해 replace() 메서드를 사용했다.

for (Map.Entry<String, String> entry : numberWords.entrySet()) {
    s = s.replace(entry.getKey(), entry.getValue());
}

이 코드 블록은 주어진 문자열 s에서 Map에 저장된 각 영단어를 그에 대응하는 숫자로 대체하는 작업을 수행한다. 이렇게 변환된 문자열은 최종적으로 숫자로 변환되어 반환된다.


문제 해결 후 배운 점

이번 문제를 해결하면서 Java에서 Map을 활용하는 방법을 익힐 수 있었다. 특히 Map.Entry를 통해 키와 값을 동시에 다루는 방법과 replace() 메서드를 사용해 문자열을 변환하는 방법을 배울 수 있었다. 앞으로 유사한 문제를 해결할 때 Map을 더욱 효과적으로 사용할 수 있을 것 같다.


문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/81301

profile
서두르지 않으나 쉬지 않고

0개의 댓글