[99클럽 4일차] [프로그래머스] Lv.1 숫자 문자열과 영단어

Dev.Dana·2024년 10월 31일
0

Algorithm

목록 보기
9/25
post-thumbnail


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

문제를 풀기전에 과거회상 타임

코테 스터디 4일차에 이 문제가 나오다니.. 정말 대과거에 첫 취준을 했을시절 도전했었던 문제다ㅠㅠㅋㅋㅋㅋ 심지어 깃헙에 올렸어야 됐었나? 그랬던 것 같은데 잘 기억은 나지 않는다.

HashMap 써서 일단 숫자랑 영어 담아놓고 맞는 단어 하나씩 숫자로 변환해 나가면서 풀어보자 했는데 결국 못풀었었다.

지금 다시 공부해보니 풀리긴 풀린다. 정말 다행이게도 😂

문자열 내 영어 숫자 단어를 실제 숫자로 변환하기

주어진 문자열에서 영어단어로 표현된 숫자들을 실제 문자로 변환해야한다.

  • 예를 들어 "one4seveneight"라는 입력이 주어지면 "one"은 1로, "seven"은 7로 변환하여 최종 결과 1478을 만들어 내는 것이 문제 !
  • 문자와 숫자의 혼합 형태를 적절하게 문자는 문자끼리 변환하고, 숫자는 그대로 출력해서 합치는 것이 이 문제의 핵심이다.

해결 방식

  1. 영어단어와 숫자를 매핑한다.
    • HashMap을 사용하여 영어단어가 등장할 때 해당하는 숫자로 바로 변환할 수 있도록 미리 key - value 형태로 저장해둔다.
  2. 문자와 숫자를 구분해서 처리한다
    • 영어단어인 경우, 문자열을 char단위로 쪼개서 StringBuilder에 더해가며 문자열이 숫자 영단어가 되는 경우 결과 문자열(result)에 숫자로 변환하여 저장한다.
    • 숫자인 경우, 결과 문자열에 바로 추가한다.

코드 구현

import java.util.*;

class Solution {
    public int solution(String s) {
        HashMap<String, Integer> 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);
        
        StringBuilder result = new StringBuilder();
        StringBuilder tmp = new StringBuilder();

        for (char c : s.toCharArray()) {
            // 숫자일 때
            if (Character.isDigit(c)) {
                result.append(c);
                tmp.setLength(0); // 임시 문자열 초기화
            } else {
                // 영어일 때
                tmp.append(c);
                String tmpWord = tmp.toString();
                
                // 단어가 완성되면 변환하여 추가
                if (map.containsKey(tmpWord)) {
                    result.append(map.get(tmpWord));
                    tmp.setLength(0); // 임시 문자열 초기화
                }
            }
        }
        
        return Integer.parseInt(result.toString());
    }
}

주의사항

✅계속해서 답이 틀리게 나와서 뭐지?????? 했는데 잘 보니 숫자일 때 result에 바로 담고 tmp를 초기화를 하지 않았더라.. 😅


임시 문자열 변수 tmp는 영어단어나, 숫자가 완성 될 때 즉, result에 값을 추가하는 시점에 바로바로 초기화를 해줘야한다.


추가) 다른사람의 풀이 확인하기

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);
    }
}

생각해보니 배열에 그냥 쭉 저장하면 됐는데.. 왜 이렇게 어렵게 돌아갔을까? 배열에 인덱스가 있다는 사실을 까맣게 잊고있었다ㅋㅋㅋㅋ 역시 기초가 제일 중요하다.

replaceAll 메서드를 통해 한 번의 순회로 문자열 변환을 완료할 수 있어 코드가 훨씬 효율적이고 간단했다.
다른 사람의 풀이를 보면 이렇게 내가 생각하지 않았던 방향으로 새로운 해답을 찾을 수 있어 좋다.

profile
어제의 나보단 나은 오늘의 내가 되기를

0개의 댓글