-
[백준] 1713 - 후보 추천하기알고리즘 2023. 5. 13. 16:12728x90
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)
'알고리즘' 카테고리의 다른 글
[백준] 1449 - 수리공 (0) 2023.05.15 [백준] 2491 - 수열 (1) 2023.05.15 [백준] 14716 - 현수막 (0) 2023.05.13 [백준] 1969 - DNA (1) 2023.05.13 [백준] 1748 - 수 이어 쓰기1 (0) 2023.05.12