문제 보기 · 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단계 · 코드 흐름
- 영단어 목록
["zero", "one", …, "nine"]을 만든다. - 목록의 번호 i와 단어 w를 차례로 꺼내, s 안의 w를 모두
str(i)로 바꾼다. - 다 바꾼 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"을 돌려주면 틀린다.
다른 풀이: 글자를 하나씩 읽으며 영문자를 모았다가, 모은 글자가 영단어 하나와 같아지면 숫자로 바꾸는 방법도 있다. 문자열을 규칙대로 읽는 방법은 문자열 파싱 문서에서 다룬다.
-
프로그래머스 스쿨, “숫자 문자열과 영단어” (https://school.programmers.co.kr/learn/courses/30/lessons/81301), 2026-09-30 조회. ↩