리스트를 정렬할 때는 파이썬 내장 함수인 sort와 sorted를 많이 쓰는 듯하다.
비슷하게 딕셔너리를 정렬할 때는 sorted(dict.items())를 쓴다.
이를 백준 1181번 문제를 풀 때 활용해 보았다.
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
1. 길이가 짧은 것부터
2. 길이가 같으면 사전 순으로
n개의 단어를 받아 단어 길이와 알파벳 순으로 정렬하였다.
import operator
n = int(input())
l = [input() for _ in range(n)]
len_list = {}
for word in l:
len_list[word] = len(word)
final_list = sorted(len_list.items(), key=operator.itemgetter(1,0))
for i in final_list:
print(i[0])
정렬 시, 딕셔너리의 key값과 value값을 둘 다 고려해야 할 때 operator 패키지가 유용하다.
index함수가 생각보다 시간을 많이 잡아먹는다.
리스트 전체 요소의 index를 구해야 할 때는 for문에서 enumerate 함수로 순차적으로 미리 구해놓는 것이 빠르다.
이는 백준 사이트에서 18870번 문제에서 시간초과가 나느냐 나지 않느냐의 큰 차이를 불러온다.
예를 들어
import sys
n= int(sys.stdin.readline())
l = list(map(int,sys.stdin.readline().split()))
sheet = sorted(set(l))
for i in l:
print(sheet.index(i), end=' ')
위 코드는 시간 초과가 나지만
import sys
n= int(sys.stdin.readline())
l = list(map(int,sys.stdin.readline().split()))
sheet = sorted(set(l))
dic = {}
for a,b in enumerate(sheet):
dic[b]=a
for i in l:
print(dic[i], end=' ')
이 코드는 정답으로 처리된다.
흔히 말하는, 메모리를 더 써서 속도를 올리는 상황인 듯 하다.