[SWEA][D3][#01221] GNS

작성:    

업데이트:

카테고리:

태그: , ,

출처

학습용 포스트입니다. 본 포스트가 문제가 될 시 수정 또는 삭제하겠습니다.


문제

숫자 체계가 우리와 다른 어느 행성이 있다. 아래는 이 행성에서 사용하는 0 ~ 9의 값을 순서대로 나타낸 것이다.

“ZRO”, “ONE”, “TWO”, “THR”, “FOR”, “FIV”, “SIX”, “SVN”, “EGT”, “NIN”

0 ~ 9 의 값을 나타내는 단어가 섞여 있는 문자열을 받아 작은 수부터 차례로 정렬하여 출력하는 프로그램을 작성하라.

예를 들어 입력 문자열이 “TWO NIN TWO TWO FIV FOR” 일 경우 정렬한 문자열은 “TWO TWO TWO FOR FIV NIN” 이 된다.


입력

입력 파일의 첫 번째 줄에는 테스트 케이스의 개수가 주어진다.

그 다음 줄에 #기호와 함께 테스트 케이스의 번호가 주어지고 공백문자 후 테스트 케이스의 길이가 주어진다.

그 다음 줄부터 바로 테스트 케이스가 주어진다. 단어와 단어 사이는 하나의 공백으로 구분하며, 문자열의 길이 N은 100≤N≤10000이다.


출력

각 테스트 케이스마다 주어진 문자열을 거울에 비춘 문자열로 출력한다.


예제

입력

2
bdppq
qqqqpppbbd


출력

#1 pqqbd
#2 bddqqqpppp


My Sol

def ston(dict1, s):
    return dict1.get(s)

lst1 = ["ZRO", "ONE", "TWO", "THR", "FOR", "FIV", "SIX", "SVN", "EGT", "NIN"]
dict1 = {lst1[i]:i for i in range(10)}

T = int(input())
for tc in range(T):
    tc, L = input().split()
    print(tc)
    L = int(L)
    nums = input().split()
    nums2 = [ston(dict1, i) for i in nums]

    cnt_lst = [0]*10
    for n in nums2:
        cnt_lst[n]+=1

    i = 0
    for n in cnt_lst:
        k = f'{lst1[i]} '*n
        print(k, end='')
        i += 1

    print()

입력으로 받은 각 문자 리스트 nums는 문자열을 매치되는 숫자로 변환하는 함수 ston을 따로 만들어 숫자로 바꾸었고, 이를 nums2 배열에 저장하였다. 그리고 nums2 배열의 각 숫자 항목에 대하여 해당 값을 인덱스로 하는 cnt_lst를 별도로 만들어 모두 0으로 초기화하였다. 이후 nums2의 항목에 따라 값을 인덱스로 하여 1씩 추가하였다.

이렇게 되면 cnt_lst에는 각 수마다 몇 개나 존재하는지 개수를 셀 수 있게 되는데, cnt_lst의 0부터 9까지 수에 대하여 이를 다시 lst1의 인덱스로 하여 숫자 문자로 개수만큼 출력해주면 되겠다. 사이에 공백을 주기 위해 f-string을 사용하였다.

dict1을 comprehension을 이용해 간단하게 표현했는데, 처음에는 하드코딩하여 불필요하게 긴 함수를 만들었는데 개선하였다.


결과

PASS

연산시간 166ms, 코드길이 504B로 연산시간은 동기들과 15ms가량 차이가 나고, 코드 길이도 꽤나 짧게 하여 문제를 해결할 수 있었다.

댓글남기기