n번째 문자를 1순위 기준으로 삼는 것이다. 만약 n번째 문자가 같다면 해당 문자열 전체를 사전순으로 비교해야 한다.1. 문제 핵심
문자열 리스트 strings와 정수 n이 주어진다. 각 문자열의 n번째 문자를 기준으로 문자열들을 오름차순 정렬해야 한다.
단, n번째 문자가 같은 문자열들이 있다면 문자열 전체를 기준으로 사전순 정렬해야 한다.
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번째 문자를 비교하고, 같으면 문자열 전체를 사전순으로 비교한다.
key=lambda x: x[n]2순위 기준까지 필요할 때:
key=lambda x: (x[n], x)9. 사용한 핵심 문법 정리
sorted()에서 어떤 값을 기준으로 정렬할지 지정한다.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 |
