본문 바로가기

알고리즘

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

[level 1] 숫자 문자열과 영단어 - 81301

문제 링크

성능 요약

메모리: 10.4 MB, 시간: 0.02 ms

구분

코딩테스트 연습 > 2021 카카오 채용연계형 인턴십

채점결과

정확성: 100.0
합계: 100.0 / 100.0

제출 일자

2023년 12월 1일 15:34:56

문제 설명

img1.png

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

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

  • 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초

풀이

def solution(s):
    answer = ''
    dic = {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5,
           'six': 6, 'seven': 7, 'eight': 8, 'nine': 9, 'zero': 0}
    strings = [char for char in s]
    char = ''

    while strings:
        if strings[0].isdigit():
            answer += strings[0]
            strings.pop(0)

        else:
            char += strings[0]
            strings.pop(0)
            if char in dic:
                answer += str(dic.get(char))
                char = ''

    return int(answer)

느낀점

문제를 보자마자 dict에 0~9에 해당되는 영단어에 숫자를 매칭시키는 부분까지는 다른 사람과 비슷하게 생각했다. 이후에 답을 찾는 과정에서 숫자가 아닌 문자로 되어있을 때, 해당 문자를 통째로 바꿀 수 있는 방법에 대해서 생각했는데 replace를 사용하면 된다는 것 까지는 얼추 알았지만, 정확히 어떻게 사용할지에 대한 감이 없었다.

그래서 위에 풀이처럼 while안에서 문자 하나마다 전부 다 list에 넣고 앞에서부터 숫자를 전부 pop하는 식으로 대체했다. 문자라면 char에 더하고 중간중간 그 문자가 dict에 있는지 확인하고, 있다면 거기에 있는 숫자를 가져오고를 반복했다.

다 풀고나서 다른 사람의 풀이를 보면서 느낀거지만, 어느 특정 함수나 기능에 대해서 안다고 해서, 이것을 제대로 사용할 수 있다고는 말할 수 없을것 같다. 앞으로도 지금처럼 계속적인 공부가 되면 좋겠다.