[SWEA][D3][#01221] GNS
작성:    
업데이트:
카테고리: SWEA D3
태그: ProblemSolving, SWEA D3, SWEA PS
출처
학습용 포스트입니다. 본 포스트가 문제가 될 시 수정 또는 삭제하겠습니다.
문제
숫자 체계가 우리와 다른 어느 행성이 있다. 아래는 이 행성에서 사용하는 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가량 차이가 나고, 코드 길이도 꽤나 짧게 하여 문제를 해결할 수 있었다.
댓글남기기