문제 링크

<aside> 💡 정렬/문자열

</aside>

Memory 117136KB Time 168ms Code Length 623B

from functools import cmp_to_key as cmp

def compare(str1, str2):
    for c1, c2 in zip(str1, str2):
        if order.index(c1) < order.index(c2):
            return -1
        elif order.index(c1) > order.index(c2):
            return 1
    return len(str1) - len(str2)

N = int(input())
arr = []
order = ['a','b','k','d','e','g','h','i','l','m','n','@','o','p','r','s','t','u','w','y']

for _ in range(N):
    k = input().strip()
    k = k.replace('ng','@')
    arr.append(k)

arr = sorted(arr, key=cmp(compare))

for i in range(len(arr)):
    if '@' in arr[i]:
        arr[i] = arr[i].replace('@','ng')
    print(arr[i])

이 코드는 사용자로부터 입력받은 문자열들을 특정 순서에 따라 정렬하는 프로그램이다.

먼저, functools 모듈의 cmp_to_key 함수를 cmp로 불러온다. 이 함수는 비교 함수를 정렬 함수의 key 매개변수로 변환하는 역할을 한다.

compare 함수는 두 문자열을 비교하여 첫 번째 문자열이 두 번째 문자열보다 사전적으로 앞서면 -1, 뒤에 있으면 1을 반환하고, 두 문자열이 같으면 두 문자열의 길이 차를 반환한다. 이때, 문자열의 비교 순서는 order 리스트에 정의된 순서를 따른다.

사용자로부터 문자열의 개수 N을 입력받고, N개의 문자열을 입력받아 arr 리스트에 저장한다. 이때, 'ng'는 '@'로 치환하여 저장한다.

arr 리스트를 compare 함수를 key로 사용하여 정렬한 후, '@'를 다시 'ng'로 치환하여 출력한다. 이렇게 하면, 'ng'가 하나의 문자로 취급되어 정렬된다.