728x90
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/81301
주어진 문자열을 모두 숫자로 바꾸는 문제이다.
예를 들어,
"one4seveneight"과 같은 문자열이 주어질 때, 이를 1478로 반환하면 된다.
처음 풀이 (오답)
def solution(s):
answer = []
dict = {
'zero' : 0,
'one' : 1,
'two' : 2,
'three' : 3,
'four' : 4,
'five' : 5,
'six' : 6,
'seven' : 7,
'eight' : 8,
'nine' : 9
}
# 딕셔너리의 키만 k 배열에 저장(zero, one, ..)
k = dict.keys()
for j in range(len(s)):
# s가 숫자이면 바로 answer에 넣기
if s[j].isnumeric():
answer.append(str(s[j]))
else:
# 딕셔너리의 키와 비교하여 앞에서부터 두 글자 비교
for i in k:
if i[0:2] == s[j:j+2]:
answer.append(str(dict[i]))
# 영어를 숫자로 바꾸면 X로 변경
s = s.replace(i, 'X'*len(i))
break
return int(''.join(answer))
처음에 푼 풀이는 위와 같다.
영단어와 숫자에 해당하는 딕셔너리를 만들고,
주어진 문자열을 순회하며,
문자가 숫자이면 바로 answer 배열에 넣고,
숫자가 아니면, 앞의 2글자를 비교하여 같은 것을 찾아 answer에 넣었다.
위와 같이 풀면, 70점이 나온다.
시간초과는 아닌듯하여..
구글링을 통해 다시 풀어보았다ㅠㅠ
정답 풀이
정답을 보고 내가 너무 어렵게 풀고 있었다는 것을 꺠닫았다.
def solution(s):
answer = ''
dict = {
'zero' : 0,
'one' : 1,
'two' : 2,
'three' : 3,
'four' : 4,
'five' : 5,
'six' : 6,
'seven' : 7,
'eight' : 8,
'nine' : 9
}
word = ''
for char in s:
# 주어진 문자가 숫자면 answer에 넣기
if char.isnumeric():
answer += char
else:
# 숫자가 아니면, word에 하나씩 저장
word += char
# word 문자가 dict에 존재하면 그 값을 answer에 넣기
if word in dict:
answer += str(dict[word])
word = ""
return int(answer)
위의 풀이는 내가 앞서 풀었던 풀이와 비슷한 방법이다.
그러나, 좀 더 효율적으로 replace 메서드를 쓰지 않은 방법이다.
아래 풀이는 매우 간단한 방법이다!
def solution(s):
num_dict = {
"zero": "0", "one": "1", "two": "2", "three": "3", "four": "4",
"five": "5", "six": "6", "seven": "7", "eight": "8", "nine": "9"
}
for key in num_dict:
s = s.replace(key, num_dict[key])
return int(s)
위처럼 쉬운 방법이 있었는데 생각해내지 못한게 너무 아쉽다.
영단어와 숫자가 매핑된 딕셔너리를 만들고,
이를 바탕으로 replace를 통해 영어를 모두 숫자로 바꿔준다.
def solution(s):
words = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
for i in range(len(words)):
s = s.replace(words[i], str(i))
return int(s)
위의 방법은 딕셔너리를 쓰지 않은 방법이다.
숫자라는 성질을 이용해, 단순히 영단어 배열을 만들고, 영단어의 인덱스 값을 이용해서
원하는 숫자 값을 가져오는 것이다.
느낀점
항상 생각하는건데,
문제를 최대한 쉽게 생각해야겠다.
정답을 보면, 절대 내가 풀지 못하는 문제가 아니다.
항상 쉽게 생각하고, 너무 어렵지 않게 풀어봐야겠다.
728x90
'코딩테스트 > PYTHON' 카테고리의 다른 글
[프로그래머스][PYTHON] Lv. 1 공원 산책 (0) | 2024.08.13 |
---|---|
[프로그래머스][PYTHON] Lv. 1 이상한 문자 만들기 (0) | 2024.08.08 |
[프로그래머스][PYTHON] Lv. 1 예산 (0) | 2024.08.07 |
[프로그래머스][PYTHON] Lv. 1 햄버거 만들기 (0) | 2024.08.06 |
[프로그래머스][PYTHON] Lv. 1 같은 숫자는 싫어 (0) | 2024.08.06 |