import sys
n = int(input())
circles = []
for _ in range(n):
x, r = map(int, sys.stdin.readline().split())
circles.append(("L", x - r))
circles.append(("R", x + r))
circles.sort(key=lambda x: (x[0]), reverse=True)
circles.sort(key=lambda x: x[1])
이 경우 독립적인 sort를 2번 썼는데, 앞에서 한 정렬의 결과가 보장된다고 하는데 왜 그러는지 설명해 줄 수 있어?
물론입니다! 주어진 코드에서 두 번의 정렬이 어떻게 작동하는지와 왜 두 번째 정렬에서 첫 번째 정렬의 결과가 보장되는지 설명하겠습니다.
import sys
n = int(input())
circles = []
for _ in range(n):
x, r = map(int, sys.stdin.readline().split())
circles.append(("L", x - r))
circles.append(("R", x + r))
circles.sort(key=lambda x: (x[0]), reverse=True)
circles.sort(key=lambda x: x[1])
첫 번째 정렬:
circles.sort(key=lambda x: (x[0]), reverse=True)
이 정렬은 key
에 따라 (x[0])
을 기준으로 정렬합니다. 여기서 x[0]
은 "L"
또는 "R"
이므로, 이 정렬은 ("L", ...)
이 ("R", ...)
보다 먼저 오도록 만듭니다. 즉, 모든 ("L", ...)
이 모든 ("R", ...)
보다 앞에 위치합니다.
두 번째 정렬:
circles.sort(key=lambda x: x[1])
이 정렬은 key
에 따라 x[1]
을 기준으로 오름차순으로 정렬합니다. 즉, 원의 좌표 값 (즉, x - r
또는 x + r
)을 기준으로 정렬합니다.
파이썬의 정렬 알고리즘은 안정적(stable) 정렬입니다. 안정 정렬에서는 같은 값이 있을 때, 이전의 정렬 상태가 유지됩니다. 즉, 두 번째 정렬이 첫 번째 정렬의 결과를 유지하면서 진행됩니다.
안정성이란, 같은 키 값이 있을 경우 첫 번째 정렬에서의 순서가 두 번째 정렬에서도 그대로 유지된다는 의미입니다. 예를 들어, ("L", 1)
과 ("R", 1)
이 있다면, 첫 번째 정렬 후 ("L", 1)
은 ("R", 1)
보다 앞에 있게 되며, 두 번째 정렬에서 1
이라는 값이 같은 경우 원래의 순서 (("L", 1)
먼저) 그대로 유지됩니다.
따라서:
"L"
이 "R"
보다 앞에 오도록 정렬되고,x[1]
값에 따라 정렬됩니다.정렬 과정의 결과:
"L"
태그의 원들이 먼저 오고,x[1]
값이 있는 경우, "L"
이 "R"
보다 먼저 오게 됩니다.