[코딩 테스트 연습 입문] 특이한 정렬

2023. 1. 3. 16:42code/[프로그래머스] python

문제

정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.

 

❗제한사항

  • 1 ≤ n ≤ 10,000
  • 1 ≤ numlist의 원소 ≤ 10,000
  • 1 ≤ numlist의 길이 ≤ 100
  • numlist는 중복된 원소를 갖지 않습니다.

 

입출력 예

 

입출력 예 설명

입출력 예 #1

  • 4에서 가까운 순으로 [4, 5, 3, 6, 2, 1]을 return합니다.
  • 3과 5는 거리가 같으므로 더 큰 5가 앞에 와야 합니다.
  • 2와 6은 거리가 같으므로 더 큰 6이 앞에 와야 합니다.

입출력 예 #2

  • 30에서 가까운 순으로 [36, 40, 20, 47, 10, 6, 7000, 10000]을 return합니다.
  • 20과 40은 거리가 같으므로 더 큰 40이 앞에 와야 합니다.

 

✔풀이

def solution(numlist, n):
    answer = []
    abs_num = []
    
    for num in numlist:
        abs_num.append(abs(n-num))
        
    set_abs_num = set(abs_num)
    abs_num=sorted(list(set_abs_num))
    
    for i in abs_num:
        final_list=[]
        for num in numlist:
            if i==abs(n-num):
                final_list.append(num)
        final_list.sort(reverse=True)
        answer+=final_list

    return answer

📝설명

numlist의 숫자를 하나씩 꺼내어 n과의 차이의 절댓값을 중복 없이 저장한 후, for문을 돌려야겠다고 생각했다.

이 때 절댓값을 for문으로 돌리고, 내부에 for문을 하나 더 생성하여 절댓값==n-numlist의 원소인 걸 찾아내어, final_list라는 빈 리스트에 저장한다.

같은 절댓값을 가진 수가 있을수도 있으니, 계속해서 내부 for문을 돌리고, 내부 for문이 끝나면 final_list를 큰 수 손으로 정렬한 후, answer에 더하는 걸 반복하면 답이 도출된다.

 

👑모범 답안

🔎numlist를 정렬한다.... 

어떻게 정렬하냐면, key를 기준으로 정렬한다.

key는 lambda를 이용했다.

오늘의 배운 점은 lambda에 2개 이상을 가지고 놀 수 있다.

처음에 절댓값을 설정해서, 작은 절댓값을 가질수록 앞에 오도록 했고, 만약 같은 절댓값을 가진다면, 큰 수를 앞에 두어야 하기 때문에 -x를 하여 -x가 작은 순으로 return 하게 했다.

 

👀느낀 점

: 설명 기깔났다. 찢었다. 남의 것만......

언젠간 내 코드가 맨 앞에 뜨는 날이 오길 .. 

 

💻 문제 출처

코딩테스트 연습 - 특이한 정렬 | 프로그래머스 스쿨 (programmers.co.kr)