출처: 구름 알고리즘 먼데이 챌린지 7주차
문제
구름이는 구름 사이트의 UXUI디자이너로 일하게 되었다. 구름이의 첫 업무는 구름 사이트에서 사용자들이 자주 실행하는 이벤트를 정리하는 일이다. 이때 이벤트란 사용자가 웹사이트에서 실행하거나, 클릭한 것을 의미한다.
구름이는 이를 위해서 사용자들이 취할 수 있는 이벤트를 N개로 규정하고, 각각의 이벤트에 1번부터 N번까지 번호를 붙였다.
구름이는 이어서 M명의 사용자가 구름 사이트에서 이벤트를 실행한 내역을 추출하였다. 추출한 정보를 바탕으로 구름이는 사용자들이 가장 자주 실행하는 이벤트들을 알아내고자 한다. 한 사람이 같은 이벤트를 여러 번 실행한 경우에도 중복으로 세어준다.
구름이를 도와 M 명의 사용자들이 가장 자주 실행했던 이벤트들을 찾아 출력하시오.
입력
첫째 줄에 구름이가 정리한 이벤트의 개수 N(1<=N<=100,000) 과 사용자의 수 M (1<=M<=1,000)이 공백을 두고 주어진다.
둘째 줄부터 M개의 줄에 걸쳐서 사용자가 구름 사이트에 접속하여 실행한 이벤트의 정보가 아래와 같이 주어진다.
- 한 줄에는 한 명의 사용자의 정보를 담고 있다.
- i+1 번째 줄의 첫 번째 정수 k (1<=k <= 100) 는 i 번 사용자가 실행한 이벤트의 개수이다.
- 이후 같은 줄에 k 개의 정수가 공백을 두고 주어진다. 각 정수는 i 번 사용자가 실행한 이벤트의 번호를 의미한다.
- 이벤트의 번호는 모두 1 이상 N 이하의 정수이다.
출력
추출한 정보를 바탕으로 사용자들이 구름 사이트에서 가장 많이 실행한 이벤트를 출력하시오. 단, 가장 많이 실행한 이벤트가 여러 개라면 각 이벤트를 공백으로 구분하여, 이벤트 번호가 큰 순서에서 작은 순서로 출력하시오.
입력 | 출력 |
4 4 4 1 2 3 4 4 1 2 3 4 4 1 2 3 4 4 1 2 3 4 |
4 3 2 1 |
4 4 4 1 2 3 4 4 1 2 3 4 4 1 2 3 4 4 1 2 3 3 |
3 |
풀이
defaultdict를 사용해서 N개의 이벤트가 각각 몇 번 실행됐는 지를 기록한다.
'''
1,2,...,N개의 이벤트
M명의 사용자가 이벤트를 실행한 내역을 보고 가장 자주 실행한 이벤트 찾기
- 한 사람이 같은 이벤트 여러 번 실행해도 여러번 세어준다
- 가장 많이 실행한 이벤트가 여러 개라면, 큰 번호 먼저 출력
'''
from collections import defaultdict
#import sys
#sys.stdin = open('./input.txt', 'r')
# 1. 입력 받기
N, M = map(int, input().split())
cnt = defaultdict(int)
for _ in range(M):
arr = list(map(int, input().split()))[1:]
for i in arr:
cnt[i] += 1
#print(cnt)
# 2. 개수 -> 이벤트 번호 큰 순서로 정렬
cnt = sorted(cnt.items(), key=lambda x: (x[1], x[0]), reverse= True)
#print(cnt)
temp = cnt[0][1]
print(cnt[0][0], end=' ')
for i in range(1, len(cnt)):
if cnt[i][1] != temp:
break
print(cnt[i][0], end=' ')
📝
defaultdict 선언
from collections import defaultdict
dictionary = defaultdict(int)
sorted와 lambda 함수를 사용해서 리스트 정렬하기
a = [(0,1), (0,2), (1, 1), (1,0)]
b = sorted(a)
print(b) # [(0, 1), (0, 2), (1, 0), (1, 1)]
# 첫번째 원소를 기준으로 정렬
c = sorted(a, key = lambda x : x[0])
print(c) # [(0, 1), (0, 2), (1, 0), (1, 1)]
# 두번째 원소를 기준으로 정렬
d = sorted(a, key = lambda x : x[1])
print(d) # [(1, 0), (0, 1), (1, 1), (0, 2)]
# 첫번째, 두번째 원소로 우선순위를 지정
e = sorted(a, key = lambda x : (x[0], x[1]))
print(e) # [(0, 1), (0, 2), (1, 0), (1, 1)]
한 줄로 출력하기
arr = [1,2,3,4]
for i in arr:
print(i, end = ' ')
# 출력값: 1 2 3 4
'코테 공부 > 그 외 사이트' 카테고리의 다른 글
[Python] 1206. [S/W 문제해결 기본] 1일차 - View (0) | 2022.11.25 |
---|---|
[Python/BFS] 3.구름이의 여행 2 (0) | 2022.11.22 |
[Python/DFS] 2.퍼져나가는 소문 / 그래프 탐색 (0) | 2022.11.21 |
[Python/BFS] 이코테 미로탈출 (중요. 기본기) (0) | 2022.08.17 |
[python/그리디] 큰 수의 법칙 (0) | 2022.08.16 |