[프로그래머스]/python

[프로그래머스]2021카카오 채용연계형 인턴십>숫자 문자열과 영단어

0_TLS 2023. 7. 2. 18:48

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

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

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

입출력 예

sresult

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

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • "three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.
  • 입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.

입출력 예 #4

  • s에는 영단어로 바뀐 부분이 없습니다.
def solution(s):
    word = {'zero':0, 'one':1, 'two':2, 'three':3, 'four':4, 'five':5, 'six':6, 'seven':7, 'eight':8, 'nine':9}
    answer = ''
    temp = ''
    for i in range(len(s)):
        if s[i].isdigit():
            answer += s[i]
        else:
            if(s[i] not in word):
                temp += s[i]
                if(temp in word):
                    answer += str(word[temp])
                    temp = ''
    return int(answer)

 

 word = {'zero':0, 'one':1, 'two':2, 'three':3, 'four':4, 'five':5, 'six':6, 'seven':7, 'eight':8, 'nine':9}

입력받은 문자열에서 영어 알파벳에 대응하는 숫자를 딕셔너리 형태로 저장함.

 

answer = ""
temp = '""

    for i in range(len(s)):
        if s[i].isdigit():
            answer += s[i]

 

입력받은 문자열을 차례로 보면서 숫자가 나오면 answer에 추가함.

※ isdigit

isdigit은 string클래스에 있는 메서드이다.

str.isdigit()형태로 사용함.

문자열이 숫자로만 이루어져 있으면 true반환/ 문자가 단 하나라도 있으면 false반환.

 

  1. str.isdigit("판단하고자 하는 문자열")
  2. "판단하고자 하는 문자열".isdigit()

두가지 형태로 사용 가능하다. 이 함수는 음수(-)나 소수점(.)은 숫자가 아닌 문자로 판단하기 때문에 실수나 음수는 판단하지 못한다.  즉, '0이상인 정수'로만 이루어진 문자열에서만 true를 반환한다. 

 

        else:
            if(s[i] not in word):
                temp += s[i]
                if(temp in word):
                    answer += str(word[temp])
                    temp = '""

 숫자가 아닌 문자가 나오면 temp라는 문자열에 해당 문자를 추가하고, word에 해당하는 단어가 되면 answer에 추가함. 그리고 중복을 없애기 위해 temp를 다시 빈 문자열로 만들어준다.

예를들어 temp에 o, n, e가 차례로 추가되어 one이라는 단어가 되면 temp in word가 true가 되어 if문이 실행됨. 

word[temp] = 0이므로 answer에 0추가 한 후 temp를 비움.

 

return int(answer)

 answer는 str형이기 때문에 "1478", "234567"과 같은 형태로 출력됨. 기댓값은 int형이기 때문에 int형으로 바꿔서 return함.

 

 

<간단한 방법>

word = {'zero':0, 'one':1, 'two':2, 'three':3, 'four':4, 'five':5, 'six':6, 'seven':7, 'eight':8, 'nine':9}
def solution(s):
    answer = s
    for key, value in word.items():
    	answer = answer.replace(key, value)
    return int(answer)

 

※딕셔너리 keys(), values(), items()

keys() - 딕셔너리의 키들을 리턴

values() - 딕셔너리의 값들을 리턴

items() - 딕셔너리의 키와 값 쌍을 리턴

dic = {'a':0, 'b':1, 'c':2}

print(dic.keys())
print(dic.values())
print(dic.items())
dict_keys(['a', 'b', 'c'])
dict_values([0, 1, 2])
dict_items([('a', 0), ('b', 1), ('c', 2)])

 

※replace()

문자열.replace("변경하고 싶은 문자/문자열", "변경될 문자", 횟수)

*횟수 : 지정한 횟수만큼만 변경. 지정하지 않으면 모두 변경

변경하고 싶은 문자가 문자열 안에 여러번 등장하는 경우, 변경 횟수를 지정하면 앞에서부터 찾은 n개가 변경됨.

string = "ABCdeF"

print(string.replace('de', 'DE'))
ABCDEF