ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] - 숫자 문자열과 영단어 (81301: 2021 카카오 채용연계형 인턴십)
    알고리즘/프로그래머스 2024. 2. 28. 12:28

    📚 문제 - 81301

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

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

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

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


    제한사항

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

    입출력 예

    s result
    "one4seveneight" 1478
    "23four5six7" 234567
    "2three45sixseven" 234567
    "123" 123
    • 입출력 예 #1
      문제 예시와 같습니다.
    • 입출력 예 #2
      문제 예시와 같습니다.
    • 입출력 예 #3
      "three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다. 입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.
    • 입출력 예 #4
      s에는 영단어로 바뀐 부분이 없습니다. 제한시간 안내

    제한시간 안내

    • 정확성 테스트 : 10초

     

    ⌨️ 작성한 코드

    import java.util.HashMap;
    
    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 sb = new StringBuilder(); 
            int i = 0;
            
            while (i < s.length()) {
                if (Character.isDigit(s.charAt(i))) { // 숫자인 경우
                    sb.append(s.charAt(i)); // 그대로 추가
                    i++;
                } else { // 영단어인 경우
                    // 영단어를 찾기 위해 연속된 문자열을 확인
                    for (int j = 3; j <= 5; j++) {
                        String substr = s.substring(i, i + j); // 연속된 문자열을 추출
                        if (map.containsKey(substr)) { // 해당 영단어가 맵에 존재하는 경우
                            sb.append(map.get(substr)); // 숫자로 치환하여 추가
                            i += j; // 인덱스 업데이트
                            break;
                        }
                    }
                }
            }
            
            return Integer.parseInt(sb.toString());
        }
    }

     

    👀 좋아요 98개의  다른  사람의 풀이 

    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(String regex, String replacement): 문자열에서 특정 패턴을 찾아 해당 패턴을 대체 문자열로 모두 치환
      정규표현식(regex)과 일치하는 부분을 대체 문자열(replacement)로 모두 치환한다. 여기서 regex는 치환하고자 하는 문자열 패턴을 나타내며, replacement는 치환될 문자열이다.

      • 정규표현식 사용:
        String original = "apple orange apple banana apple";
        String replaced = original.replaceAll("apple", "kiwi");
        System.out.println(replaced); // 출력: kiwi orange kiwi banana kiwi​​
      • 공백 제거:
        String original = "  Hello,  world!  ";
        String replaced = original.replaceAll("\\s+", ""); // \\s+는 하나 이상의 공백에 대응되는 정규표현식
        System.out.println(replaced); // 출력: HelloWorld!
      • 대소문자 구분 없이 대체:
        String original = "Hello world, hello everyone!";
        String replaced = original.replaceAll("(?i)hello", "hi"); // (?i)는 대소문자를 구분하지 않도록 하는 플래그
        System.out.println(replaced); // 출력: hi world, hi everyone!

     

     

     

     
Designed by Tistory.