코딩테스트/프로그래머스

[프로그래머스] 숫자 문자열과 영단어 풀이 - python

블랙곰 2022. 1. 13. 05:50

 

2021 카카오 채용연계형 인턴십

 

Lv.1 문자열 유형

 

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

  • 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로 주어집니다.

 

풀이

 

문제와는 전혀 상관없지만 sorted를 통해 내림차순으로 정렬하여 replace 하였다.

문제의 영단어 표에서 다른 단어로 대치되어도 풀 수 있도록 긴 단어부터 변환되도록 풀었다.

문자열 변환의 경우 딕셔너리 자료형에서 숫자를 문자로 정의하여 작업을 줄일 수 있다.

 

def solution(s):
    eng_vocab = {
                    'zero': "0",
                    'one': "1",
                    'two': "2",
                    'three': "3",
                    'four': "4",
                    'five': "5",
                    'six': "6",
                    'seven': "7",
                    'eight': "8",
                    'nine': "9"
                }
    
    for x in sorted(list(eng_vocab.keys()), key=len, reverse=True):
        if x in s:
            s = s.replace(x, eng_vocab[x])
    
    return int(s)

 

추가 풀이

 

def solution(s):
    eng = ['zero', 'one', 'two', 'three', 'four',
           'five', 'six', 'seven', 'eight', 'nine']
    for word in eng:
    	if word in s:
            s = s.replace(word, f'{eng.index(word)}')
    return int(s)

 

단어의 중복이 없고 대한 인덱스가 연속적인 경우 위처럼 하나의 리스트에 인덱스를 이용하여 푸는게 제일 깔끔해보인다.