본문 바로가기

Python(알고리즘,문제풀이)/프로그래머스(입문100제)

코딩테스트입문 / 특이한 정렬

728x90

📚문제

출처 : 프로그래머스 / 특이한 정렬(https://school.programmers.co.kr/learn/courses/30/lessons/120880?language=python3)

 

📝풀이

def solution(numlist, n):
    
    n_distance = {}
    
    for idx, k in enumerate(numlist):
        n_distance[idx,abs(k-n)] = k
        
    sorted_n_distance = sorted(n_distance.items(), key=lambda x: (x[0][1],-x[1]))
    result = [value for key,value in sorted_n_distance]
    
    return result

머릿속에 있는 걸 구현하기 위해 Chat GPT의 도움을 조금 참고했다

numlist와 n을 입력받은 다음

numlist의 원소들 k 와 n의 차이의 절대값을 딕셔너리 형태로 저장

{(0, 3): 1, (1, 2): 2, (2, 1): 3, (3, 0): 4, (4, 1): 5, (5, 2): 6}

첫 번째 입출력을 예시로들면

(인덱스,n과의거리) : numlist원소의 

형태로 나오게 된다

 

sorted_n_distance = sorted(n_distance.items(), key=lambda x: (x[0][1],-x[1]))

그 다음 n_distance.items()를 해주게 되면

딕셔너리의 형태가(키,값)의 형태로 변환된다

 

그리고 정렬기준(key)을 람다함수로 설정

x[0][1] => 키(인덱스,n과의거리) 중 n과의 거리를 선택하여 정렬

 

이 때, 만약 거리가 동일하다면 

-x[1] => 값이 큰 순으로 정렬 ( x[1]은 값의 오름차순 )

(2차 기준을 어떻게 설정해야하나 고민했었는데

key에 값을 2번할당하거나, lambda식이 끝난 뒤에 설정해주는 것이 아니라 ( ) 안에 기준을 순서대로 작성)

[((3, 0), 4), ((4, 1), 5), ((2, 1), 3), ((5, 2), 6), ((1, 2), 2), ((0, 3), 1)]

 

 

마지막으로 value 값을 리스트 컴프리헨션으로 작성하여 결과값 도출

result = [value for key,value in sorted_n_distance]
return result
---------------------------------------------------
[4, 5, 3, 6, 2, 1]
728x90