본문 바로가기
Problem Solving

[Hash Table] 에너그램 정렬

by Bokoo14 2022. 12. 13.

애너그램? 두 문자가 있을때, 두 문자의 알파벳 순서를 무시하고 둘 다 동일하면 애너그램이다

예) eat, ate

N개의 단어가 주어졌을 때, 애너그램을 알파벳 순으로 다음과 같이 정렬하시오.
1. 서로 애너그램인 단어들은 하나의 그룹으로 묶어 한 줄에 오름차순으로 정렬하여 출력한다.
2. 애너그램 그룹의 가장 첫 번째 단어의 오름차순으로 각 그룹을 출력한다.
예를 들어, N=6개의 단어 eat, tea, tan, ate, nat, bat 가 입력으로 주어지면,
다음과 같이 세 개의 애너그램 그룹으로 나누어 한 줄에 하나의 그룹을 출력한다.
ate eat tea
bat
nat tan
위에서 각 애너그램 그룹의 첫 단어인 ate, bat, nat가 오름차순으로 그룹의 출력 순서를 결정한다.
또한, 각 그룹에서도 오름차순으로, ate, eat, tea 처럼 오름차순으로 정렬하여 출력한다.
Input
첫째 줄에 단어의 개수 N이 주어진다.
둘째 줄부터 N개의 줄에 한 줄에 하나의 단어가 주어진다.
단어는 모두 영어 알파벳 소문자로만 구성되어 있다고 가정해도 된다.
6
eat
tea
tan
ate
nat
bat

16
undisplayed
trace
tea
singleton
eta
eat
displayed
crate
cater
carte
caret
beta
beat
bate
ate
abet

Output
한 줄에 하나의 애너그램 그룹을 출력한다.
각 애너그램 그룹은 알파벳 오름차순으로 정렬하여 출력한다.
출력하는 애너그램 그룹의 순서는 각 그룹의 첫 번째 단어의 오름차순으로 정한다.
ate eat tea
bat
nat tan

abet bate beat beta
ate eat eta tea
caret carte cater crate trace
displayed
singleton
undisplayed
import sys
input = sys.stdin.readline

n = int(input())
# 애너그램 그룹의 가장 첫 번째 단어의 오름차순으로 각 그룹을 출력한다 -> 입력을 받을 때 미리 모든 단어들을 오름차순 정렬하면 된다
array = sorted(list(input().strip()) for _ in range(n))

answer = {} # 해시 테이블
def check(word):
    tmp = ''.join(sorted(word)) # 단어를 알파벳 순으로 정렬
    if tmp in answer: # 해시 테이블에 이미 있으면 append
        answer[tmp].append(''.join(word))
    else: # 해시 테이블에 없는 단어이면 
        answer[tmp] = [''.join(word)]


# 각각의 단어들에 대해 애너그램인지 check
for i in range(n):
    check(array[i])

answer = list(answer.values())

for i in range(len(answer)):
    print(' '.join(answer[i]))