[ Python ] 문자열 내 마음대로 정렬하기

2026. 6. 29. 10:16·TIL/코테
[Programmers/Python] 문자열 내 마음대로 정렬하기 풀이 정리
문제 링크: Programmers - 문자열 내 마음대로 정렬하기
sorted(), key, lambda, 튜플 기준 정렬을 이용해 문자열 리스트를 조건에 맞게 정렬하는 문제다.
이번 문제의 핵심은 문자열 리스트를 정렬하되, 각 문자열의 n번째 문자를 1순위 기준으로 삼는 것이다. 만약 n번째 문자가 같다면 해당 문자열 전체를 사전순으로 비교해야 한다.
sorted() key lambda 튜플 정렬 문자열 인덱싱 사전순 정렬

1. 문제 핵심

문자열 리스트 strings와 정수 n이 주어진다. 각 문자열의 n번째 문자를 기준으로 문자열들을 오름차순 정렬해야 한다.

단, n번째 문자가 같은 문자열들이 있다면 문자열 전체를 기준으로 사전순 정렬해야 한다.

1순위 정렬 기준: x[n]
2순위 정렬 기준: x

핵심 구조: sorted(strings, key=lambda x: (x[n], x))
n번째 문자가 같을 때 n-1번째 문자로 비교하는 것이 아니다. 문제 조건은 문자열 전체를 사전순으로 비교하는 것이다.

2. 처음 접근

처음에는 strings 리스트를 for문으로 순회하고, strings[i][n]으로 각 문자열의 n번째 문자를 가져오는 방식으로 생각했다.

하지만 가져온 문자들을 어떻게 비교하고, 원본 문자열과 연결해서 정렬할지에서 막혔다. 새로운 리스트에 append()한 뒤 정렬하면 원본 문자열과 달라질 수 있고, 딕셔너리로 key-value를 만들어야 하는지도 고민했다.
def solution(strings, n):
    answer = []
    for i in range(strings):
        strings[i][n]
    return answer

이 접근에서 strings[i][n]으로 각 문자열의 n번째 문자를 가져올 수 있다는 생각은 맞다. 다만 이 문제는 직접 비교문을 만들기보다, 파이썬 정렬 함수의 key를 이용해 정렬 기준을 지정하는 방식이 더 적합하다.

3. 처음 코드에서 틀린 점

1) range(strings)는 사용할 수 없다

range() 안에는 정수가 들어가야 한다. 그런데 strings는 리스트이므로 range(strings)는 사용할 수 없다.

잘못된 형태: range(strings)
인덱스로 순회할 때: range(len(strings))

하지만 이 문제에서는 인덱스로 직접 순회하지 않아도 된다. sorted()의 key를 사용하면 각 원소를 어떤 기준으로 정렬할지 지정할 수 있다.

2) 문자만 따로 모으면 원본 문자열 정렬이 어렵다

strings[i][n]으로 각 문자열의 n번째 문자만 모으면, 정렬 기준이 되는 문자는 얻을 수 있다. 하지만 최종 반환값은 문자 리스트가 아니라 원래 문자열 리스트여야 한다.

이 문제는 n번째 문자를 새 리스트에 모으는 문제가 아니라, 원본 문자열을 유지한 채 정렬 기준만 n번째 문자로 지정하는 문제다.

4. 단계별 개선 과정

1) sorted()와 key 사용

sorted()는 리스트를 정렬한 새 리스트를 반환한다. 여기에 key를 지정하면 어떤 값을 기준으로 정렬할지 정할 수 있다.

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

이렇게 작성하면 각 문자열 x의 n번째 문자를 기준으로 정렬할 수 있다.

2) lambda 오타 수정

처음에는 lambda를 lamda로 작성했다. 파이썬에서는 반드시 lambda라고 작성해야 한다.

잘못된 형태: lamda x: x[n]
올바른 형태: lambda x: x[n]

3) 두 번째 정렬 기준 수정

처음에는 n번째 문자가 같으면 그 앞자리인 n-1번째 문자로 비교한다고 생각했다.

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

하지만 문제 조건은 n번째 문자가 같을 때 문자열 전체를 사전순으로 비교하는 것이다. 따라서 두 번째 기준은 x[n-1]이 아니라 문자열 전체인 x가 되어야 한다.

잘못 해석한 기준: n번째 문자가 같으면 n-1번째 문자 비교
올바른 기준: n번째 문자가 같으면 문자열 전체를 사전순 비교

5. 최종 풀이

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

정렬 기준을 튜플로 지정했다. 튜플은 앞의 값부터 차례대로 비교되므로, (x[n], x)는 먼저 x[n]을 기준으로 정렬하고, 값이 같으면 x 전체를 기준으로 다시 정렬한다.

x[n]: 각 문자열의 n번째 문자
x: 문자열 전체

정렬 기준: (x[n], x)

6. 풀이 흐름

예를 들어 다음과 같은 입력이 있다고 하자.

strings = ["abce", "abcd", "cdx"]
n = 2

각 문자열의 n=2번째 문자는 다음과 같다.

"abce"[2] → "c"
"abcd"[2] → "c"
"cdx"[2] → "x"

"abce"와 "abcd"는 둘 다 n번째 문자가 "c"로 같다. 따라서 문자열 전체를 사전순으로 비교한다.

"abcd"가 "abce"보다 사전순으로 앞선다.

최종 결과: ["abcd", "abce", "cdx"]
튜플 정렬은 첫 번째 값이 같을 때 두 번째 값을 비교한다. 따라서 (x[n], x)는 이 문제의 조건을 그대로 표현한 정렬 기준이다.

7. 유사 유형 풀이

같은 핵심 문법인 sorted(), key, lambda, 튜플 기준 정렬을 사용하는 유사 문제를 풀었다.

학생 정보가 담긴 리스트 students가 주어진다. 각 원소는 ["이름", 점수] 형태이다. 점수가 낮은 순서대로 정렬하되, 점수가 같으면 이름을 사전순으로 정렬한다.
students = [
    ["minsu", 80],
    ["jiho", 90],
    ["aram", 80],
    ["yuna", 70]
]

def solution(students): 
    answer = sorted(students, key=lambda x: (x[1], x[0])) 
    return answer

원래 문제와 같은 점

두 문제 모두 sorted()의 key에 튜플을 넣어 1순위 기준과 2순위 기준을 함께 지정한다.

원래 문제: sorted(strings, key=lambda x: (x[n], x))
유사 문제: sorted(students, key=lambda x: (x[1], x[0]))

핵심 구조: sorted(리스트, key=lambda x: (1순위, 2순위))

원래 문제와 다른 점

원래 문제에서는 문자열 하나가 정렬 대상이고, x[n]은 문자열의 특정 인덱스 문자이다. 유사 문제에서는 리스트 하나가 정렬 대상이고, x[1]은 점수, x[0]은 이름이다.

원래 문제: x는 문자열
유사 문제: x는 ["이름", 점수] 형태의 리스트

8. 핵심 정리

이번 유형의 핵심은 직접 비교문을 만드는 것이 아니라, sorted()의 key에 정렬 기준을 넣는 것이다.

정렬 기준이 하나라면 key=lambda x: x[n]처럼 작성할 수 있다. 하지만 이번 문제처럼 1순위와 2순위 기준이 모두 필요하다면 튜플 형태로 기준을 묶어야 한다.

튜플 기준 정렬은 앞에서부터 차례대로 비교한다. 따라서 (x[n], x)는 먼저 n번째 문자를 비교하고, 같으면 문자열 전체를 사전순으로 비교한다.

1순위 기준만 필요할 때: key=lambda x: x[n]
2순위 기준까지 필요할 때: key=lambda x: (x[n], x)

9. 사용한 핵심 문법 정리

sorted()
리스트를 정렬한 새 리스트를 반환한다. 원본 리스트를 직접 수정하지 않는다.
key
sorted()에서 어떤 값을 기준으로 정렬할지 지정한다.
lambda
간단한 함수를 한 줄로 작성할 때 사용한다. 정렬 기준을 만들 때 자주 사용된다.
문자열 인덱싱
x[n]은 문자열 x의 n번째 문자를 가져온다.
튜플 기준 정렬
(x[n], x)처럼 튜플을 정렬 기준으로 주면 첫 번째 값부터 차례대로 비교한다.
사전순 정렬
문자열은 기본적으로 사전순으로 비교된다. "abcd"는 "abce"보다 앞선다.

10. 기본 Python 구조

sorted(리스트, key=lambda x: (1순위_기준, 2순위_기준))
정리하면, 이번 문제는 문자열 인덱싱과 튜플 기준 정렬을 함께 사용하는 문제다. x[n]으로 1순위 기준을 만들고, x 전체를 2순위 기준으로 넣으면 문제 조건을 간단하게 만족할 수 있다.

'TIL > 코테' 카테고리의 다른 글

[ Python ] K 번째 수 정렬  (0) 2026.06.30
[ SQL ] 최솟값 구하기와 어린 동물 찾기  (0) 2026.06.29
[ Python ] 숫자 문자열과 영단어  (0) 2026.06.26
[ SQL ] 상위 n개 레코드  (0) 2026.06.25
[ Python ] 시저 암호  (0) 2026.06.25
'TIL/코테' 카테고리의 다른 글
  • [ Python ] K 번째 수 정렬
  • [ SQL ] 최솟값 구하기와 어린 동물 찾기
  • [ Python ] 숫자 문자열과 영단어
  • [ SQL ] 상위 n개 레코드
yustitix
yustitix
Semiconductor Process & Quality Data Analyst Candidate, M.S. in Polymer Engineering, @Yustitix </br> Aspiring Semiconductor Process & Quality Data Analyst, aiming to grow into a Manufacturing AI Data Scientist.
  • yustitix
    데분하다
    yustitix
  • 전체
    오늘
    어제
    • 분류 전체보기 (52)
      • Portfolio (4)
      • Job search (9)
        • JD (3)
        • Article study (5)
        • News room (1)
      • TIL (35)
        • TIL (2)
        • 코테 (11)
        • Python (6)
        • 머신러닝 (6)
        • 기초 통계 (3)
        • 반도체 공정 입문 (7)
      • Project (4)
        • FAERS 이상사례 자가보고 데이터 기반 모니터링.. (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
yustitix
[ Python ] 문자열 내 마음대로 정렬하기
상단으로

티스토리툴바