<aside> 🔥 문제 링크

</aside>

문제 정리

<aside> 🔥 n개의 테스트케이스가 주어지고

n개의 줄에 걸쳐 단어가 한줄에 하나씩 주어진다.

다음 조건에 따라 정렬하는 프로그램을 작성하자.

  1. 길이가 짧은 것부터
  2. 길이가 같으면 사전 순으로

단, 중복된 단어는 하나만 남기고 제거해야한다.

</aside>

# 입력값
13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours

# 출력값
i
im
it
no
but
more
wait
wont
yours
cannot
hesitate

접근방법

<aside> 🔥 이번 정렬 문제는 병합 정렬로 접근을 해보았다.

길이순으로 정렬하기 위해 리스트 생성 자체를 [글자의길이, 글자]로 묶어서 생성했다.

중복은 set()으로 제거하고 다시 list()로 묶어 리스트화했다.

</aside>

코드

<aside> 🔥 병합 정렬 알고리즘 작성

</aside>

import sys

def input():
    return sys.stdin.readline().strip()

def merge(arr1, arr2):
    result = []
    i = j = 0
    while i < len(arr1) and j < len(arr2):
        if arr1[i] < arr2[j]:
            result.append(arr1[i])
            i += 1
        else:
            result.append(arr2[j])
            j += 1

    while i < len(arr1):
        result.append(arr1[i])
        i += 1

    while j < len(arr2):
        result.append(arr2[j])
        j += 1
    return result

def mergesort(lst):
    if len(lst) <= 1:
        return lst
    mid = len(lst) // 2
    L = lst[:mid]
    R = lst[mid:]

    return merge(mergesort(L), mergesort(R))

<aside> 🔥 리스트를 글자길이와 글자로 묶어서 생성한다.

</aside>

n = int(input())
li = [input() for _ in range(n)]
count_li = []
for i in li:
    count_li.append((len(i), i))

<aside> 🔥 set()으로 중복 문자를 제거하고 다시 list()로 리스트화시켜준다.

</aside>

for word in mergesort(list(set(count_li))):
    print(word[1])