문제 보기 · Level 1 · 2021 카카오 채용연계형 인턴십 · 정답률 74% · 푼 사람 62,009명 (2026-09-30 기준)1

문제

숫자 일부가 영단어(zero~nine)로 바뀐 문자열 s가 주어진다. 예를 들어 "one4seveneight"은 1478이다. 원래 숫자를 정수로 돌려준다.

  • s 길이 1~50
  • 답은 1 이상 2,000,000,000 이하

풀이

막히면 한 단계씩 펼친다.

필요한 개념

리스트와 문자열의 문자열 메서드 replace와 int 변환.

1단계 · 작은 예로 손으로 풀기

"two5zero"에서 영단어를 찾아 숫자로 바꾼다.

  • two → 2, 5는 그대로, zero → 0
  • 이어 붙이면 "250", 정수로 바꾸면 250
2단계 · 가장 단순한 방법과 그 속도

영단어 10개(zero~nine)마다 “문자열 안의 이 단어를 모두 숫자로 바꾼다”를 한다. 한 번 바꿀 때 문자열 길이(최대 50)만큼 보니, 모두 10 × 50 = 500번 정도다. 넉넉하다.

3단계 · 핵심 아이디어

숫자와 영단어를 짝지은 표를 만들고, 표를 따라 차례로 바꾼다. 영단어 목록을 0부터 9까지 순서대로 적어 두면, 목록에서의 번호가 곧 그 단어의 숫자다.

바꾸는 순서는 상관없다. 열 단어 중 어느 것도 다른 단어 안에 통째로 들어 있지 않고, 바꾼 결과는 숫자라서 새 영단어를 만들지 않기 때문이다.

4단계 · 코드 흐름
  1. 영단어 목록 ["zero", "one", …, "nine"]을 만든다.
  2. 목록의 번호 i와 단어 w를 차례로 꺼내, s 안의 w를 모두 str(i)로 바꾼다.
  3. 다 바꾼 s를 int로 바꿔 돌려준다.
5단계 · 파이썬 코드
def solution(s):
    words = ["zero", "one", "two", "three", "four",
             "five", "six", "seven", "eight", "nine"]
    for i, w in enumerate(words):   # (0, "zero"), (1, "one"), …
        s = s.replace(w, str(i))    # w를 모두 i로 바꾼 새 문자열을 s에 다시 담는다
    return int(s)
  • enumerate(words): 번호와 원소를 함께 꺼낸다.
  • s.replace(w, str(i)): s 안의 w를 모두 찾아 바꾼 새 문자열을 돌려준다. 문자열은 고칠 수 없어서 s 자체는 그대로다. 그래서 s = 로 다시 받아야 한다.
  • str(i): 숫자 i를 글자로 바꾼다. replace는 글자끼리만 바꿀 수 있다.
  • int(s): 마지막에 글자 "250"을 수 250으로 바꾼다.
6단계 · 실행 추적

s = "two5zero"

단어 바꾼 뒤 s
zero → 0 "two50"
one ~ nine 중 two만 있음: two → 2 "250"

int("250") = 250을 돌려준다.

7단계 · 복잡도와 흔한 실수

단어 10개 × 문자열 길이 L이라 \(O(10L) = O(L)\)이다.

  • s.replace(...)만 쓰고 결과를 받지 않으면 아무것도 바뀌지 않는다.
  • int로 바꾸지 않고 문자열 "250"을 돌려주면 틀린다.

다른 풀이: 글자를 하나씩 읽으며 영문자를 모았다가, 모은 글자가 영단어 하나와 같아지면 숫자로 바꾸는 방법도 있다. 문자열을 규칙대로 읽는 방법은 문자열 파싱 문서에서 다룬다.

검증: 문제의 예시 4개를 통과했고, 무작위 수 2,000개의 자릿수 일부를 영단어로 바꾼 입력에서 모두 원래 수로 돌아왔다 — 03_pg81301_p1.py
  1. 프로그래머스 스쿨, “숫자 문자열과 영단어” (https://school.programmers.co.kr/learn/courses/30/lessons/81301), 2026-09-30 조회. ↩