/ PROGRAMING, PYTHON

순서정하기

순서정하기

주어진 배열에서 큰 숫자의 위치에 순서대로 숫자를 채워 출력합니다.

조건

  • 중복된 원소 없음
  • 1 <= 입력된 배열의 길이 <= 10
  • 1 <= 입력된 배열의 원소 <= 100

예시

input result
[3, 76, 24] [3, 1, 2]
[1, 2, 3, 4, 5, 6, 7] [7, 6, 5, 4, 3, 2, 1]
[30, 10, 23, 6, 100] [2, 4, 3, 5, 1]

기존 작성 코드 및 문제

  • 아래의 코드는 sorted에서 이미 O(NlogN) 정도의 시간이 든다고 가정합니다.
  • 그리고 반복문에서 index를 계속 부르게 되므로 계속 부르게 되므로 O(N^2)의 시간복잡도를 가지게 됩니다.
def solution(emergency):
    sorted_list = sorted(emergency,reverse=True)
    answer = [sorted_list.index(x)+1 for x in emergency]
    return answer

문제 해결 코드 및 설명

  • 이를 시간복잡도의 효율을 생각해서 dict을 사용하여 코드를 작성해봅니다.
def solution(emergency):
    dict_sorted = {e : i+1 for i,e in enumerate(sorted(emergency)[::-1])}
    return [dict_sorted[x] for x in emergency]
  • 오름차순으로 정렬하는 것은 sorted 함수에 [::-1]로 표현해주었다.
    • sorted에 reverse = True 매개변수를 집어 넣어주어도 됩니다.
  • {} 반복문을 List Comprehension 방법으로 표현합니다.
    • enumerate 를 사용하여 인덱스를 순서로 표현합니다.
    • 값을 순서대로 넣어주는 방법으로 진행합니다.
  • 만들어진 dict 에서 배열 원소를 입력받아 해당 인덱스를 출력합니다.
  • 이와 같은 방법으로 기존의 시간 복잡도보다 훨씬 줄어든 O(NlogN)의 모습으로 실행할 수 있습니다.