Slow is better than NOTHING

Programmers 풀이/[KaKao]

[Python] 프로그래머스 2021 KAKAO 코딩테스트 - 숫자 문자열과 영단어

Jeff_Kang 2022. 2. 3. 23:36
반응형

문제 설명

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

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

  • 1478 → "one4seveneight"
  • 234567 → "23four5six7"
  • 10203 → "1zerotwozero3"

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

입출력 예

s result
"one4seveneight" 1478
"23four5six7" 234567
"2three45sixseven" 234567
"123" 123

카카오 채용 연계형 인턴십 문제로 출제된 문제입니다. 1단계 문제답게 전형적인 String다루기내용이였는데요, 문제는 복잡하지 않고 상당히 직관적이였습니다. 

메인 챌린지는, 문자열로 쓰여진 숫자를 맵핑하여 숫자로 리턴해주는 것이였는데요. python 의 replace를 활용해 쉽게 풀 수도 있지만 로직을 코딩으로 옮기는 연습이기에 보다 직관적으로 문제를 풀어보도록 노력해보았습니다.

  • 문자열 s를 순서대로 읽으면서 영어 숫자에 대응되는 문자열을 발견하면 영어--> 숫자로 변환
  • 변환된 값을 Stack
  • 리턴

먼저, 문자열의 substring이 영어 문자에 대응되는지 여부를 확인하기 위한 영어 숫자 팩토리 리스트를 선언하였습니다.

alphabet_num = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]

이제 s의 문자열을 하나씩 읽으면서 문자열을 만들어갑니다. 

예) "one4seveneight"  이 주어졌을 때, "o" -> "on" -> "one" => 1 처럼 문자열을 탐색하면서 대응되는 영어 숫자를 찾을 수 있습니다. 

answer list에는 숫자가 차례로 담기며, 영어 숫자가 나온다면 'alphabet_num' list에서 대응되는 인덱스가 담기게 됩니다. 다만, 한 가지 신경썼던 점이라면, 문자열이 정수 즉, 숫자인 경우에는 추후 탐색이나 'alphabet_num' 에 대응되는 인덱스가 있는지 찾는 추가적인 로직을 검사할 필요 없으므로 continue를 통해 넘어감으로써 로직을 조금 간소화 시켜보았습니다.

def solution(s):
    alphabet_num = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
    answer = []
    k = ""
    

    for c in s:
        if not c.isalpha():
            answer.append(c)
            continue

        k += c  
        # check whether k is alphabetic number 
        if k in alphabet_num:
            answer.append(str(alphabet_num.index(k)))
            k = ""

    answer = int("".join(answer))
    return answer

 

반응형