https://www.acmicpc.net/problem/1181
정렬 알고리즘이긴 하지만, sort 함수의 쓰임새에 조금 더 치중된 문항이다.
이 문제를 푸는데 필요한 역량은,
1) sort함수의 문자열 정렬 기능을 알고 있는가
2) sort함수의 key기능을 알고 있는가
3) sort함수를 여러 번 사용한 경험이 있는가
정도가 될 수 있을 것 같다.
1, 2는 파이썬 기초 문법을 공부할 때 접한 기억이 있어서 자세히는 아니어도 무의식 속에 알고 있었지만, 3에 대해서는 약간은 생소하다. 사실 글을 작성하는 지금도 아직 이해가 완벽히 간 것은 아니지만, 그래도 어떤 느낌과 결을 지닌 함수인지에 대해서는 좀 파악하게 된 것 같다.
# PYTHON CODE (1)
1
2
3
4
5
6
7
8
9
10
11
12
|
import sys
input = sys.stdin.readline
n = int(input())
s = list(set([str(input().rstrip()) for _ in range(n)]))
s.sort()
s.sort(key=lambda x: len(x))
for i in s:
print(i)
|
cs |
문제 풀이는 비교적 심플하며, 직관적으로 어느 정도 납득이 가는 풀이이다.
우리가 초점을 맞추어야 하는 부분은 8, 9번째 줄인데, 몇 개의 코드로 테스트를 해본 결과를 아래에 소개한다.
# PYTHON CODE (2) - 8, 9번 줄을 뒤바꿀 경우 return 하는 결괏값
1
2
3
4
5
6
7
8
9
10
11
|
but
cannot
hesitate
i
im
it
more
no
wait
wont
yours
|
cs |
# PYTHON CODE (3) - s.sort()만 진행하였을 경우 return 하는 결괏값
1
2
3
4
5
6
7
8
9
10
11
|
but
cannot
hesitate
i
im
it
more
no
wait
wont
yours
|
cs |
결론적으로, return값이 완전히 일치한다는 사실을 확인할 수 있는데, len을 기준으로 정렬을 시킨 뒤에 sort로 다시 정렬을 하게 되면 문자열을 사전식으로 정렬하는 sort함수의 특성 때문에 return값이 결국 사전식 정렬로 return 되는 것이다.
따라서, sort함수를 여러 번 사용할 경우엔, 사용할 key와 순서에 유의하여 사용해야 할 듯하다.
또한, 문제에 대해 고민하면서 key를 유연하게 설정하여 길이 순으로 정렬한 뒤에 사전 식으로 재정렬하게 만드는 방법은 없을까에 대한 의문을 가지게 되었다.
이러한 고민을 훌륭히 타파할 수 있다는 점이 파이썬의 아주 센스 있는 매력이 아닐까 싶다.
1번 코드의 8,9번 줄을 다음과 같이 정리하면, 위에 언급한 대로 정렬을 진행하여 한번에 원하는 정렬을 얻어낼 수 있다.
1
|
s.sort(key=lambda x: (len(x), x))
|
cs |
'백준 > 정렬' 카테고리의 다른 글
[Python] 백준, 5052(정렬 알고리즘) (0) | 2021.08.28 |
---|---|
[Python] 백준, 1026(정렬) (0) | 2021.08.22 |
[Python] 백준, 10814(정렬) (0) | 2021.08.20 |
[Python] 백준, 1427(정렬) (0) | 2021.08.18 |
[Python] 백준, 2751(정렬) (0) | 2021.08.18 |