알고리즘
[백준] 1713 - 후보 추천하기
j9972
2023. 5. 13. 16:12
728x90
1. 문제
https://www.acmicpc.net/problem/1713
1713번: 후보 추천하기
첫째 줄에는 사진틀의 개수 N이 주어진다. (1 ≤ N ≤ 20) 둘째 줄에는 전체 학생의 총 추천 횟수가 주어지고, 셋째 줄에는 추천받은 학생을 나타내는 번호가 빈 칸을 사이에 두고 추천받은 순서대
www.acmicpc.net
2. 접근
1. 이 문제는 문제의 지문을 따라서 그대로 구현하면 된다.
2. 추천 받기 { candidate 는 dict임을 인지 }
2.1 -> 추천을 받은 것중 candidate에 없다
2.1.1 -> len(candidate) 과 n을 비교해서 n보다 크거나 같다
2.1.1.1 -> heap으로 가장 작은값을 제거
2.1.1.2 -> 새롭게 heap에 데이터 추가
2.2 ->추천을 받은 것중 candidate에 있다
2.2.1 -> candidate의 value값 증가
3. 남은 것들을 사전순으로 정렬해서 출력
이 문제는 재밌었다. stack -> queue -> heap 순서로 시도해봤다
3. 풀이
#1713 실버1
import sys
input = sys.stdin.readline
#from collections import deque
import heapq
n = int(input())
m = int(input())
candidate = {}
orders = list(map(int,input().split()))
for order in orders:
if order not in candidate:
if len(candidate) >= n:
a = heapq.nsmallest(min(candidate), candidate, key=candidate.get)
candidate.pop(a[0])
candidate[order] = 1
else:
candidate[order] += 1
for ans in sorted(candidate.keys()):
print(ans, end=' ')
# 틀린 풀이 -> 내가 생각했던 로직
# [인덱스, 값]
q = deque([])
for order in orders:
if len(q) <= n:
time = len(q)
while True:
if time == 0:
break
idx, value = q.popleft()
if idx == order:
value += 1
q.append([idx,value])
time -= 1
q.append([order,1])
if len(q) > n:
cnt = m+1
check = 0
for _ in range(len(q)-1):
idx, value = q.popleft()
if value < cnt:
cnt = value
check = idx
q.append([idx,value])
if cnt >= 2:
q.popleft()
# else:
# for i in range(len(q)-1):
# if check == q[i][0]:
# q.pop(i)