문제 26 - 문자열 내 마음대로 정렬하기 (Python)

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

문자열 배열을 특정 인덱스의 문자를 기준으로 정렬하는 문제입니다. 핵심은 1차 정렬 기준은 n번째 문자, 2차 정렬 기준은 문자열 전체의 사전순으로 두는 것입니다.


1.  나의 풀이

def solution(strings, n):
    strings.sort(key=lambda x: (x[n], x))
    return strings

key에 튜플을 사용하여 정렬 기준을 두 개로 지정했습니다.

첫 번째 기준은 x[n]으로, 각 문자열의 n번째 문자입니다. 두 번째 기준은 x로, n번째 문자가 같은 경우 문자열 전체를 사전순으로 비교하도록 했습니다.


2.  오늘 배운 점 및 복기 노트

정렬 기준을 여러 개 지정하는 방법

파이썬 정렬의 key에는 단일 값뿐만 아니라 튜플도 사용할 수 있습니다. 튜플을 사용하면 앞의 값부터 차례대로 비교하므로, 여러 정렬 조건을 한 번에 표현할 수 있습니다.

key=lambda x: (1순위 기준, 2순위 기준)

이번 문제에서는 다음과 같이 정렬 기준을 지정했습니다.

key=lambda x: (x[n], x)

즉, n번째 문자를 먼저 비교하고, 같으면 문자열 전체를 비교하는 구조입니다.

 

sort()sorted()의 차이

sort()는 원본 리스트를 직접 정렬하는 in-place 연산입니다. 반면 sorted()는 원본을 바꾸지 않고 정렬된 새 리스트를 반환합니다.

이번 풀이에서는 strings.sort()를 사용했기 때문에 원본 리스트가 직접 정렬됩니다. 프로그래머스에서는 정렬된 리스트만 반환하면 되므로 문제 없이 사용할 수 있습니다.


3.  프로그래머스 코딩 테스트 문제 풀이 전략 교재에서 배울만한 점

key=lambda x: x[n]만으로는 부족함

단순히 n번째 문자만 기준으로 정렬하면, 해당 문자가 같은 문자열끼리는 사전순으로 다시 정렬되지 않습니다.

sorted(strings, key=lambda x: x[n])

이 코드는 x[n]만 비교합니다. 문제에서 요구하는 “같은 경우 사전순 정렬” 조건은 별도로 명시해야 합니다.

 

안정 정렬의 의미

파이썬 정렬은 안정 정렬입니다. 안정 정렬은 정렬 기준값이 같은 원소들의 기존 순서를 유지합니다.

따라서 x[n] 값이 같은 문자열들은 자동으로 사전순 정렬되는 것이 아니라, 입력 배열에서의 기존 순서를 유지합니다. 이 점 때문에 2차 정렬 기준을 직접 지정해야 합니다.

 

두 번 정렬하는 풀이

교재에서는 먼저 전체 문자열을 사전순으로 정렬한 뒤, 다시 n번째 문자 기준으로 정렬하는 풀이도 제시했습니다.

def solution(strings, n):
    return sorted(sorted(strings), key=lambda x: x[n])

먼저 사전순 정렬을 해두고, 이후 안정 정렬의 성질을 이용해 n번째 문자가 같은 문자열들의 사전순을 유지하는 방식입니다.

 

튜플 기준 정렬

가장 직관적인 풀이는 정렬 기준을 튜플로 만드는 방식입니다.

def solution(strings, n):
    return sorted(strings, key=lambda x: (x[n], x))

이 방식은 정렬 조건이 코드에 직접 드러납니다. x[n]을 먼저 보고, 같으면 x 전체를 본다는 의미가 명확합니다.