Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python – 회문 개수를 기준으로 행렬 정렬하기

행렬(중첩 리스트)을 회문(palindrome) 개수를 기준으로 정렬해야 하는 경우가 있습니다. 이럴 때 리스트를 매개변수로 받는 메서드를 하나 정의하고, 리스트 컴프리헨션과 join 메서드를 활용해 각 요소가 회문인지 판별한 뒤, 그 개수를 정렬 키로 사용하면 됩니다.

여기서 회문이란 앞에서 읽으나 뒤에서 읽으나 같은 문자열을 의미합니다. 예를 들어 "level", "noon", "sees" 등이 대표적인 회문입니다.

예제 코드

아래는 회문 개수를 기준으로 행렬을 정렬하는 전체 예제입니다.

def get_palindrome_count(row):
    return len([element for element in row if ''.join(list(reversed(element))) == element])

my_list = [["abcba", "hdgfue", "abc"], ["peep"], ["py", "is", "best"], ["sees", "level", "non", "noon"]]

print("원본 리스트 :")
print(my_list)

my_list.sort(key=get_palindrome_count)

print("정렬된 리스트 :")
print(my_list)

실행 결과

원본 리스트 :
[['abcba', 'hdgfue', 'abc'], ['peep'], ['py', 'is', 'best'], ['sees', 'level', 'non', 'noon']]
정렬된 리스트 :
[['py', 'is', 'best'], ['abcba', 'hdgfue', 'abc'], ['peep'], ['sees', 'level', 'non', 'noon']]

코드 설명

  • get_palindrome_count라는 이름의 메서드를 정의하며, 이 메서드는 리스트(행)를 매개변수로 받습니다.

  • 리스트 컴프리헨션을 사용하여 각 행의 요소들을 순회하면서, 요소를 뒤집은 문자열(reversedjoin 활용)이 원래 문자열과 같은지 비교해 회문 여부를 판별합니다.

  • 회문인 요소들만 새로운 리스트에 담고, 그 길이(len)를 반환하여 해당 행의 회문 개수를 계산합니다.

  • 메서드 외부에서는 문자열 값으로 구성된 중첩 리스트를 정의하고, 콘솔에 출력합니다.

  • sort 메서드에 key 인자로 앞서 정의한 메서드를 지정하여, 각 행의 회문 개수가 적은 순서대로 리스트를 정렬합니다.

  • 마지막으로 정렬된 결과를 콘솔에 출력합니다.

실행 결과를 보면 회문이 하나도 없는 ['py', 'is', 'best'](개수 0)가 가장 앞에 오고, 회문이 가장 많은 ['sees', 'level', 'non', 'noon'](개수 3)이 마지막에 배치된 것을 확인할 수 있습니다.