코테 공부/그 외 사이트

[Python] 1.UXUI 디자이너/ lambda, sorted

prefer_all 2022. 11. 21. 22:12

출처: 구름 알고리즘 먼데이 챌린지 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