새소식

Career/Coding Test

99클럽 코테 스터디 3/99일차 TIL # 숫자 문자열과 영단어(챌린저)

  • -
반응형

 

문제: 문자열 내 마음대로 정렬하기

출처: 프로그래머스

https://school.programmers.co.kr/learn/courses/30/lessons/12915

1. 문제 설명


네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"234567 → "23four5six7"10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.


입출력 예 설명
입출력 예 #1
문제 예시와 같습니다.
입출력 예 #2
문제 예시와 같습니다.
입출력 예 #3
"three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.
입출력 예 #4
s에는 영단어로 바뀐 부분이 없습니다.

2. 문제 해석

s: 일부 자리수를 문자열로 변경 or 그대로인 문자열

대응하는 영단어-> dic 형태로 구성하기

ex) "one4seveneight"


'''

3. 문제 풀이

숫자와 문자를 구분하고, 해당 문자에 해당하는 숫자로 바꾼 뒤 이들을 원래 숫자로 반환하면 된다.

주어진 문자열을 하나씩 확인하면서 숫자인지, 문자인지 확인하고 문자일 경우 tmp 임시 공간에 저장한다.

그 다음 반복문을 계속해가면서 tmp에 저장된 문자들이 대응되는 영단어가 있을 경우 해당 문자를 숫자로 변환한다.

동시에 tmp를 비우고 반복문을 이어간다.

 

1. 문자열을 처음부터 for 문으로 돌기
- 애초에 문자열이기 때문에 숫자로 형변환 가능한지에 따라 구분
2. 숫자가 나오기 전 까지의 문자열을 리스트에 담기 => X
-> 10203 → "1zerotwozero3"
2.계속 tmp 내의 문자들을 합쳐보고 그 값이 num_list에 있는지 확인

3. 담은 리스트를 문자로 합치기
4. 합친 문자열을 dic에서 찾아 tmp_ans 배열에 넣기

풀이 (1) 100/100

def solution(s):
    
    num_dic = {"zero": 0,
                "one": 1,
                'two': 2,
                'three': 3,
                'four': 4,
                'five': 5,
                'six': 6,
                'seven': 7,
                'eight': 8,
                'nine': 9}
    
    nums =['0','1','2','3','4','5','6','7','8','9']
    num_keys = list(num_dic.keys())
    
    
    tmp = []
    answer = []
    for i in s:

        if i in nums:
            answer.append(str(i))
        
        elif i not in nums and len(tmp) == 0:
            tmp.append(i)
        
        else:
            tmp.append(i)
            if ''.join(tmp) in num_keys:
                answer.append(str(int(num_dic[''.join(tmp)])))
                tmp = []
                
    
    answer = int(''.join(answer))

    return answer
테스트 1 통과 (0.04ms, 10.4MB)
테스트 2 통과 (0.02ms, 10.4MB)
테스트 3 통과 (0.04ms, 10.4MB)
테스트 4 통과 (0.03ms, 10.4MB)
테스트 5 통과 (0.04ms, 10.4MB)
테스트 6 통과 (0.04ms, 10.4MB)
테스트 7 통과 (0.05ms, 10.5MB)
테스트 8 통과 (0.04ms, 10.3MB)
테스트 9 통과 (0.05ms, 10.4MB)
테스트 10 통과 (0.02ms, 10.4MB)

5. 주요 코드 및 정리

처음에는 10203 → "1zerotwozero3"

해당 케이스를 확인하지 못해 문자로 변환된 값들이 연속으로 나오는 것을 인지하지 못했다.

그래서 기본 테스트 케이스 오류가 발생했다.

5.1 딕셔너리 자료형: key 값들만 list로 반환하기

num_keys = list(num_dic.keys())

5.2 리스트를 문자열로 합치기

''.join(tmp)

주의해야할 점은 합칠 리스트에 있는 값들이 모두 string 형의 데이터타입이어야 한다.

리스트에 int형으로 그대로 들어있을 경우 다음과 같은 오류가 발생한다.

TypeError: sequence item 0: expected str instance, int found

 

추가적으로 여유가 생기면 내가 푼 것만 작성하는게 아니라 chatgpt를 활용하거나 다른 사람들의 풀이 코드도 확인해볼 예정이다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.