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

AirPlaneMode·2021년 7월 23일
0

프로그래머스

목록 보기
3/8

1. 문제

I. 문제 설명

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

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

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

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

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

숫자영단어
0zero
1one
2two
3three
4four
5five
6six
7seven
8eight
9nine

II. 제한사항

  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

III. 입출력 예

sresult
"one4seveneight"1478
"23four5six7"234567
"2three45sixseven"234567
"123"123

2. 풀이

I. 풀이방법

  • s를 한 글자씩 읽어간다.

    • 만약 숫자라면, 바로 answer에 추가한다.
    • 만약 영어라면, 단어를 인식할 수 있을 때까지 읽은 후 answer에 추가한다.
  • 단어를 어떻게 인식할 수 있는가?

    • 예를 들어, "o"로 시작하는 숫자는 "one"밖에 없기 때문에 바로 알 수 있다.
    • 그러나 "t"로 시작하는 숫자는 "two"와 "three"가 있기에 두 번째 글자까지 알아야 단어를 인식할 수 있다.
    • 따라서, 단어를 인식할 수 있을 때까지의 최소한의 글자수를 담은 배열을 만들어 처리한다.

II. 소스코드

def solution(s):
    
    answer = []
    nums = ["z","o","tw","th","fo","fi","si","se","e","n"]
    offset = [3,2,1,3,2,2,1,3,4,3]
    
    '''
    offset은 생략한 글자수를 나타낸다.
    예를 들어, "zero"는 4글자이지만, 
    nums[0]은 "z"로 1글자기 때문에 "ero"가 생략된 상태이다.
    따라서 offset[0]은 3이 된다. 
    '''
    
    temp = ""
    i = 0
    
    while i < len(s):
        
        if s[i].isdigit(): 	# 만약 숫자라면
            answer.append(s[i]) # 그대로 answer에 넣어준다.
            
        else:			# 만약 숫자가 아니라면
            temp += s[i]
            if temp in nums: 	# 단어가 인식가능한지 확인하고
                j = nums.index(temp) # 무슨 숫자인지 구해서
                answer.append(str(j)) # answer에 넣어준다.
                i += offset[j]	# 생략된 글자만큼 i를 더해주고
                temp = ""	# temp를 초기화해준다.
                
        i += 1
                
    answer = int("".join(answer))
    
    return answer

III. 코드 설명

그림과 같은 배열이 주어진다.

i == 0일 때, s[i]는 "o"다. "o"로 시작하는 영단어는 "one"밖에 없기 때문에 answer에 1을 추가한다. 그리고 뒤의 "ne"는 읽히지 않았지만 "one"임을 인식할 수 있기 때문에 i에 2 ("ne"의 글자수)를 더해준다.

i == 3일 때, s[i]는 4다. 이는 숫자므로 answer에 4를 추가한다.

i == 4일 때, s[i]는 "s"다. 하지만 이것만으로는 "seven"인지 "six"인지 알 수 없기 때문에 기다린다.

i == 5일 때, s[i]는 "e"다. "se"로 시작하는 숫자는 "seven"밖에 없으므로, answer에 7을 추가한다. 그리고 뒤의 "ven"은 읽지 않아도 되므로 i에 3을 더해준다.

i == 9일 때, s[i]는 "e"다. "e"로 시작하는 숫자는 "eight"밖에 없으므로, answer에 8을 추가하고 i에 4("ight"의 글자수)를 더한다.

While loop가 한 번 더 돌 때, i는 14로 s의 길이보다 더 길어진다. 따라서 While을 탈출하고 함수는 종료된다.

0개의 댓글