본문 바로가기
알고리즘

[알고리즘 문제] 알파벳 사이 숫자 (Python / 파이썬)

by yewonnie 2022. 5. 21.

문제

지니는 토종 한국인이다. 영어를 못하는지, 하지 않는 것인지는 미스테리다.
영어시간에 선생님은 숫자와 알파벳 소문자가 혼합된 글자를 N개 줄로 구분 지어 내주었다. 그리고 a(1)->z(26)까지 매칭시키라 하셨다. 영어를 싫어하는 지니는 선생님이 시킨 일은 무시하고 문자열에서 연속된 숫자로 구성된 수를 뽑아서 비내림차순으로 정렬해 제출할 것이다. 0으로 시작하는 수는 의미 없는 0을 모두 지워서 적는다.
지니가 제출할 수열을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트케이스의 수 T가 주어진다..
각 테스트케이스의 첫 줄에 N이 주어진다.
각 테스트케이스의 두번째 줄부터 N줄에 걸쳐 지니가 받은 문자열들이 주어진다. 모든 문자열의 길이는 100 이하다.
( 1 ≤ T ≤ 10, 1 ≤ N ≤ 100 )

출력

각 테스트케이스마다 '#'과 테스트케이스의 번호를 출력하고 한 줄 개행한 뒤, 지니가 제출할 수열을 출력한다.

문제 풀이

유니가 받은 문자열들이 주어졌을 때 숫자만을 뽑아 오름차순으로 정렬하는 문제이다.

1sgotfkt
yt84
c93cyztn
wpyns7e4
5lub3

다음과 같은 문자열들이 주어졌을 때 숫자만 뽑는 방법이 무엇일까 생각해보았다. 

파이썬은 re 라이브러리를 제공하는데 그 중 findall() 함수는 

내가 요구하는 것을 뽑아 리스트로 제공해준다. 

 

re.findall('\d+', s) 는 s 문자열에 포함된 숫자들을 출력해준다. 

re.findall('\d', s) 또한 s 문자열에 포함된 숫자들을 출력해준다. 

둘의 차이는 c93cyztn 문자열이 있을 때

re.findall('\d+', s)['93'] 을 출력해주고 

re.findall('\d', s)['9', '3'] 을 출력해준다. 

즉, 뒤에 +가 붙으면 연속된 수를 하나로 여겨 출력해준다. 

 

만약, 숫자가 아닌 문자를 출력하고 싶다면

re.findall('[a-z]+', s)소문자를 출력해주고

re.findall('[A-Z]+', s)대문자를 출력해준다. 

낱개로 출력하고 싶다면 마찬가지로 +를 빼주면 된다. 

 

따라서 이러한 re 라이브러리를 이용하여 각 문자열을 입력 받을 때마다 숫자를 뽑아주고

배열에 모두 넣어준 뒤 마지막에 오름차순으로 정렬하여 출력해주었다. 


My Code

import re

for tc in range(int(input())):
    n = int(input()) # 문자열의 개수

    result = []
    for _ in range(n):
        s = input() # 문자열

        array = re.findall('\d+', s) # 숫자를 뽑아 리스트로 저장

        for i in array:
            result.append(int(i)) # 정수로 바꿔 배열에 저장해줌
        
    result.sort() # 저장된 수들을 오름차순으로 정렬

    print('#' + str(tc + 1))
    for i in result:
        print(i, end = ' ')
    
    print()

댓글