코드
def solution(numlist, n):
answer =[] # n과의 거리를 저장할 리스트
for i in numlist:
answer.append(i - n)
result = [] # 정렬한 배열
# 거리가 n에 가까운 순으로 정렬, 절댓값이 같으면 양수(= 큰 값) 먼저
for i in sorted(answer[:], key=lambda x:[abs(x), -x]):
result.append(numlist[answer.index(i)])
return result
[1, 2, 3, 4, 5, 6]이라는 num_list가 주어지면 n=4를 기준으로 가까운 순으로 정렬하여 [4, 5, 3, 6, 2, 1]을 만들어야 하는 문제이다.
만약, n으로부터 거리가 같다면 큰 수를 먼저 배치한다. 예를 들어 4를 기준으로 거리가 같은 3과 5는 큰 수인 5를 먼저 배치하는 것이다.
n과의 거리를 먼저 알기 위해 answer 리스트에 거리를 저장하였다.
그다음 거리의 절댓값을 기준으로 작은 수부터 정렬해 주었다. 이때 -1과 1이 있으면 큰 값을 의미하는 1을 앞에 위치하게 해주어야 하므로 sort의 두 번째 key값으로 -x를 작성해 주었다.
그럼 n과의 거리가 원하는 대로 정렬되었기 때문에 정렬된 순으로 같은 인덱스에 위치한 numlist 값을 찾아 result에 append 해주면 된다.
num_list, answer, 정렬된 answer, result를 모두 출력해 직접 과정을 눈으로 보면 조금 더 이해하기가 쉽다.
다른 사람의 코드
def solution(numlist, n):
result = sorted(numlist,key = lambda x : (abs(x-n), n-x))
return result
내 코드를 보면서 너무 리스트를 많이 만든 게 아닐까 하는 생각이 계속 들었다.
역시나, 다른 사람의 코드를 보니 모든 과정을 한 줄로 나타내었다.
주어진 numlist를 바로 정렬하면 되는 것이다.
n과의 거리의 절댓값인 abs(x-n)에 대해 먼저 정렬을 하고 abs(n-x)가 같으면 n-x가 큰 값을 먼저 정렬한다.
반응형