<문제 링크>
https://www.acmicpc.net/problem/2910
주어진 수열을 빈도, 출현순서 순으로 정렬하여 출력
<정답 코드>
sol 1) 딕셔너리에 저장 후 람다식으로 정렬 (72ms)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from collections import defaultdict
n, c = map(int, input().split())
nums = list(map(int, input().split()))
dic = defaultdict(int)
for i in nums:
dic[i] += 1
sorted_dic = sorted(dic.items(), key = lambda x: (-x[1], list(dic.keys()).index(x[0])))
for i, j in sorted_dic:
for _ in range(j):
print(i, end=' ')
|
cs |
sol 2) 딕셔너리에 저장 후 람다식으로 정렬 - 시간복잡도 개선 (36ms)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
n, c = map(int, input().split())
nums = list(map(int, input().split()))
dic = {}
order = 0
# dic[숫자] = [빈도, 출현순서] 형태로 저장
for i in nums:
if i in dic:
dic[i][0] += 1
else:
dic[i] = [1, order]
order += 1
# 출현빈도(내림차순), 출현순서(오름차순) 순으로 정렬
sorted_dic = sorted(dic.items(), key = lambda x: (-x[1][0], x[1][1]))
result = []
# 출현횟수만큼 result에 추가(append 반복보다 빠름)
for num, (cnt, _) in sorted_dic:
result.extend([num] * cnt)
# * : 리스트 요소 개별 인자로 출력
print(*result)
|
cs |
sol 1에 비해 소요시간이 절반 수준으로 감소
이유 : sol 2 line 15에서 정렬 시 매번 리스트 생성하는 반복(sol1 line 10)을 제거
식을 복잡하게 만드는 것 보다 필요한 정보를 저장해두고 꺼내 쓰는 것이 편리
람다식 연습하기
리스트 출력 시 * 사용하면 편리
'프로그래밍 > Python' 카테고리의 다른 글
백준_python 11053번 가장 긴 증가하는 부분 수열 (DP) (0) | 2024.07.29 |
---|---|
백준_python 23057번 도전 숫자왕 (set, combinations) (0) | 2024.06.19 |
백준_python 2579번 계단 오르기 (DP) (0) | 2024.06.14 |
백준_python 15686번 치킨 배달(combiantions, 백트래킹) (1) | 2024.06.13 |
백준_python 2805번 나무 자르기 (이분 탐색, 시간초과) (0) | 2024.06.11 |