SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
염라대왕은 이승의 사람들의 모든 이름을 가지고 있다.
어느날 저승에 일어난 진도 8.0 지진에 항상 정리되어 있던 이승 명부가 흐트러졌다.
이승 명부는 이름의 길이가 짧을수록 이 앞에 있었고, 같은 길이면 사전 순으로 앞에 있었다.
이왕 이렇게 된 김에 모든 이름을 다시 정리하고 같은 이름은 하나만 남겨놓기로 한 염라대왕을 도와주자.
[입력]
첫 번째 줄에 테스트 케이스의 수 T(1 ≤ T ≤ 50)가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 이승 명부의 이름 개수 N(1 ≤ N ≤ 20,000)이 주어진다.
각 테스트 케이스의 두 번째 줄부터 N개의 줄에 걸쳐서 알파벳 소문자로 이루어진 이름들이 주어진다.
이름에는 공백이 포함되지 않으며 최소 1개, 최대 50개의 알파벳으로 이루어져 있다.
[출력]
각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고,
정리된 이름을 한 줄에 하나씩 출력하라. 같은 이름은 한 번만 출력해야 하는 것을 주의하라.
파이썬의 딕셔너리(해시)를 이용해서 해결했습니다.
각 이름을 입력받아 없는 이름이면 값을 1로 생성하고, 이미 있는 이름이면 값에 +1을 해줍니다.(생략해도 무관합니다.)
키만 담은 배열에 대해서 정렬하고, 하나씩 출력해주는데 이때 정렬 시 .sort()가 아닌 sorted()를 사용합니다.
.sort()의 경우 배열 원본 자체를 변경하지만, .sorted()는 배열을 참조하여 정렬된 새로운 배열을 생성합니다.
sorted의 key로 람다함수를 주었는데, 이승의 명부 조건을 따라야 하기 때문입니다.
이승의 명부는 아래와 같이 정리되야 합니다.
1. 이름의 길이가 짧을 수록
2. 같이 길이면 사전 순으로
문제에선 입출력 예시로 길이가 2번 만으로도 정렬이 되는 예를 주었는데, 계속 오류가 나서 문제 조건을 다시 읽고 해결했습니다.
코드
#swea 7701 염라대왕의 이름 정렬
T = int(input())
for t in range(1, T+1):
name = {}
n = int(input())
for i in range(n):
ipt = input().rstrip()
if ipt in name:
name[ipt] += 1
else:
name[ipt] = 1
answer = list(name.keys())
print(f"#{t}")
for a in sorted(answer, key=lambda x : (len(x),x)):
print(a)
'알고리즘 풀이 > Python' 카테고리의 다른 글
[Python] 보급로 (SWEA 1249번 파이썬) (0) | 2023.11.04 |
---|---|
[Python] Ladder (SWEA 1210번 파이썬) (0) | 2023.11.04 |
[Python] N과 M(1) (백준 15649번 파이썬) (0) | 2023.11.02 |
[Python] 빙산 (백준 2573번 파이썬) (1) | 2023.11.01 |
[Python] Flatten (SWEA 1208번 파이썬) (1) | 2023.10.31 |