https://www.acmicpc.net/problem/1713
1713번: 후보 추천하기
첫째 줄에는 사진틀의 개수 N이 주어진다. (1 ≤ N ≤ 20) 둘째 줄에는 전체 학생의 총 추천 횟수가 주어지고, 셋째 줄에는 추천받은 학생을 나타내는 번호가 빈 칸을 사이에 두고 추천받은 순서대
www.acmicpc.net
| 2 초 | 128 MB | 18250 | 5476 | 4176 | 31.389% |
문제
월드초등학교 학생회장 후보는 일정 기간 동안 전체 학생의 추천에 의하여 정해진 수만큼 선정된다. 그래서 학교 홈페이지에 추천받은 학생의 사진을 게시할 수 있는 사진틀을 후보의 수만큼 만들었다. 추천받은 학생의 사진을 사진틀에 게시하고 추천받은 횟수를 표시하는 규칙은 다음과 같다.
- 학생들이 추천을 시작하기 전에 모든 사진틀은 비어있다.
- 어떤 학생이 특정 학생을 추천하면, 추천받은 학생의 사진이 반드시 사진틀에 게시되어야 한다.
- 비어있는 사진틀이 없는 경우에는 현재까지 추천 받은 횟수가 가장 적은 학생의 사진을 삭제하고, 그 자리에 새롭게 추천받은 학생의 사진을 게시한다. 이때, 현재까지 추천 받은 횟수가 가장 적은 학생이 두 명 이상일 경우에는 그러한 학생들 중 게시된 지 가장 오래된 사진을 삭제한다.
- 현재 사진이 게시된 학생이 다른 학생의 추천을 받은 경우에는 추천받은 횟수만 증가시킨다.
- 사진틀에 게시된 사진이 삭제되는 경우에는 해당 학생이 추천받은 횟수는 0으로 바뀐다.
후보의 수 즉, 사진틀의 개수와 전체 학생의 추천 결과가 추천받은 순서대로 주어졌을 때, 최종 후보가 누구인지 결정하는 프로그램을 작성하시오.
입력
첫째 줄에는 사진틀의 개수 N이 주어진다. (1 ≤ N ≤ 20) 둘째 줄에는 전체 학생의 총 추천 횟수가 주어지고, 셋째 줄에는 추천받은 학생을 나타내는 번호가 빈 칸을 사이에 두고 추천받은 순서대로 주어진다. 총 추천 횟수는 1,000번 이하이며 학생을 나타내는 번호는 1부터 100까지의 자연수이다.
출력
사진틀에 사진이 게재된 최종 후보의 학생 번호를 증가하는 순서대로 출력한다.

제출 코드
# 1713 후보 추천하기
# state 1
import sys
input = sys.stdin.readline
N = int(input())
R = int(input())
arr = list(map(int, input().split()))
lst = {}
for i in range(R):
if arr[i] in lst: # 사진을 걸 곳에 이미 있는 경우
lst[arr[i]][0] += 1 # 추천수 + 1
else: # 사진거는곳에 없는 경우
if len(lst) < N: # 사진거는 곳에 자리가 있다면
lst[arr[i]] = [1, i] # 추천수 1, 들어온 순서 i
else: # 자리가 없다면
# lst의 요소들을 x[1][0]의 값의 오름차순으로 정렬하고, 같은 경우에는 x[1][1]의 값의 오름차순으로 정렬
del_lst = sorted(lst.items(), key = lambda x : (x[1][0], x[1][1]))
del(lst[del_lst[0][0]]) # 맨 앞을 제거
lst[arr[i]] = [1, i] # 새로운 값 추가
result = list(sorted(lst.keys()))
print(*result)
딕셔너리를 한참 안써서 익숙해지려고 써본 코드.. 지만 결국 폭풍 검색을 했다.
딕셔너리 자료구조와 딕셔너리에 람다쓰는 방법에 익숙해져야겠다는 생각을 많이하게 된 문제
* 람다
lambda x: (x[1][0], x[1][1])은 한 줄의 익명 함수를 만든다.
여기서 x는 각 딕셔너리 항목을 나타내며, (키, 값)의 형태이다.
x[1][0] 은 딕셔너리 값의 첫번째 요소, x[1][1] 은 딕셔너리 값의 두번째 요소이다.즉, 각 딕셔너리 항목(x)의 값에서 첫번째 요소, 두번째 요소를 기준으로 정렬하고자 했다.
'알고리즘 > 백준' 카테고리의 다른 글
| 0318. [BOJ#2667] 단지번호붙이기 (0) | 2024.03.20 |
|---|---|
| 0317. [BOJ#14503] 로봇 청소기 (0) | 2024.03.20 |
| 0315. [BOJ#31575] 도시와 비트코인 (1) | 2024.03.16 |
| 0314. [BOJ#1092] 배 (0) | 2024.03.14 |
| 0313. [BOJ#7983] 내일 할거야 (1) | 2024.03.13 |