와드의 블로그

숫자 문자열과 영단어 본문

PS/프로그래머스

숫자 문자열과 영단어

Ward 2026. 3. 11. 15:59

문제

네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 문자열을 주었습니다. 이 문자열을 원래 숫자로 복원하여 반환하는 문제입니다.

예를 들어 "one4seveneight"이라는 문자열이 주어지면, 이를 1478이라는 정수로 변환하여 반환해야 합니다.

  • 입력: 영단어와 숫자가 섞인 문자열 s (길이 1 이상 50 이하)
  • 출력: 복원된 정수

링크: https://school.programmers.co.kr/learn/courses/30/lessons/81301

풀이 1: 문자열 파싱

1. 문자 판별 및 변환

알파벳일 경우, 각 숫자를 나타내는 영단어의 첫 글자가 고유하다는 점을 이용합니다.

  • z -> zero
  • o -> one
  • e -> eight
  • n -> nine

첫 글자가 겹치는 경우에는 바로 다음 글자(i + 1)를 확인하여 구분합니다.

  • t -> two / three
  • f -> four / five
  • s -> six / seven

문자열을 순회하면서 현재 문자가 숫자인지 영단어의 알파벳인지 확인합니다.

 

2. 인덱스 점프

단어를 판별한 후에는 해당 영단어의 길이만큼 인덱스 i를 건너뛰어 불필요한 탐색을 방지합니다. 공통적으로 적용되는 i++를 고려하여 단어 길이보다 1 작게 인덱스를 더해줍니다.

 

3. 결과값 누적

문자열을 정수로 이어 붙이기 위해, 새로운 숫자를 더하기 전에 기존 정수 값(ans)에 10을 곱하여 자릿수를 하나씩 올려주는 방식을 사용합니다.

코드 1: 직접 문자열 파싱

class Solution {
    public int solution(String s) {
        int ans = 0;

        for (int i = 0; i < s.length(); ) {
            char c = s.charAt(i);

            // 자릿수 올림
            ans = ans * 10;

            // 1. 숫자인 경우
            if (c >= '0' && c <= '9') {
                ans += c - '0';
            }
            // 2. 영단어인 경우 첫 글자(및 두 번째 글자)로 숫자 유추
            else if (c == 'z') { // zero
                i += 3;
            } else if (c == 'o') { // one
                ans += 1;
                i += 2;
            } else if (c == 't') {
                if (s.charAt(i + 1) == 'o') { // two
                    ans += 2;
                    i += 2;
                } else { // three
                    ans += 3;
                    i += 4;
                }
            } else if (c == 'f') {
                if (s.charAt(i + 1) == 'o') { // four
                    ans += 4;
                } else { // five
                    ans += 5;
                }
                i += 3;
            } else if (c == 's') {
                if (s.charAt(i + 1) == 'i') { // six
                    ans += 6;
                    i += 2;
                } else { // seven
                    ans += 7;
                    i += 4;
                }
            } else if (c == 'e') { // eight
                ans += 8;
                i += 4;
            } else { // nine (나머지 경우는 n으로 시작하는 nine뿐임)
                ans += 9;
                i += 3;
            }

            // 다음 문자로 이동 (영단어의 경우 위에서 길이-1 만큼 이미 더해짐)
            i++;
        }

        return ans;
    }
}

풀이 2: replaceAll 메서드 활용

두 번째 방식은 자바의 내장 메서드인 replaceAll()을 활용하는 방법입니다. 코드가 매우 간결해집니다.

  1. 단어 배열 선언:인덱스와 숫자가 일치하도록 0부터 9까지의 영단어를 순서대로 배열에 선언합니다.
  2. 문자열 치환:0부터 9까지 반복문을 돌며, replaceAll()을 사용해 문자열 내에 존재하는 영단어를 해당하는 숫자(인덱스 값)로 치환합니다.
  3. 정수형 변환:모든 영단어가 숫자로 치환된 문자열을 Integer.parseInt()를 통해 정수형으로 변환하여 반환합니다.

코드 2: replaceAll 메서드 활용

class Solution {
    public int solution(String s) {
        // 인덱스와 숫자가 일치하도록 영단어 배열 선언
        String[] words = {"zero", "one", "two", "three", "four",
                          "five", "six", "seven", "eight", "nine"};

        // 0부터 9까지 순회하며 문자열 내의 영단어를 숫자로 치환
        for (int i = 0; i < 10; i++) {
            s = s.replaceAll(words[i], String.valueOf(i));
        }

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

'PS > 프로그래머스' 카테고리의 다른 글

유연근무제  (0) 2026.04.02
교점에 별 만들기  (1) 2026.03.13
피로도  (0) 2026.03.12
신규 아이디 추천  (0) 2026.03.12
옹알이 (2)  (0) 2026.03.11