Lv0 특이한 정렬
https://school.programmers.co.kr/learn/courses/30/lessons/120880
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이 문제는 가장 주어진 n으로부터 가장 가까운 수를 정렬시켜야 하는 문제이다.
먼저 가까운 수를 알기 위해서는 변수 - n를 해서 가장 크기가 작은 값이 가장 가까운 수이기에 이를 이용하면 되는데
양수, 음수 값이 나올 수 있기 때문에 abs(변수 - n)을 해줘야 한다.
허나 이렇게 했을 때 만약 차이값이 같은 수가 있을 경우에는 변수1, 변수2중에서 더 큰 값이 먼저 정렬이 되어야 한다고 문제야 나와있기에 이는 -x를 하게 되면 정렬할 때 더 큰 값에 음수를 붙이게 되면 더 작아지기에 더 큰 값이 먼저 정렬이 가하다.
answer = sorted(numlist, key = lambda x : (abs(x-n), -x))를 해주면 되는데 lambda는 key에 리스트 혹은 튜플로 2개를 줄 수 있는데 문제에 첫번째 예시를 토대로 보면
(abs(1-4), -1)
(abs(2-4), -2)
(abs(3-4), -3)
(abs(4-4), -4)
(abs(5-4), -5)
(abs(6-4), -6)
은 (3, -1), (2, -2), (1, -3), (0, -4), (1, -5), (2, -6) 이라는 튜플을 반환.
-> 이를 sort 를 통해 정렬하면 오름차순으로 정렬되기 때문에 (0, -4), (1, -5), (1, -3), (2, -6), (2, -2), (3, -1)
이는 각 요소 x를 기준으로 보면 4, 5, 6, 3, 2, 1로 정렬이 된 것이다.
즉 numlist에서 x에 numlist의 원소를 순서대로 넣어주는데 abs(x-n), x-n 한 것을 x에 튜플 형태로 넣어주고 key는 정렬기준 지정하는데 사용되는데 이 문제에서는 lambda x : (abs(x-n), -x)이 정렬기준이 되는 것이다. 이를 토대로 numlist를 정렬해준것이다.