import sys
input = sys.stdin.readline
N = int(input())
problem_dict = {}
re1_dict = {}
for _ in range(N):
pb_num,l_num = map(int,input().split())
re1_dict[(l_num,pb_num)] = 1
problem_dict[pb_num] = l_num
M = int(input())
for _ in range(M):
command,*arg = input().split()
if command == 'add':
pb_num,l_num = map(int,arg)
problem_dict[pb_num] = l_num
re1_dict[(l_num,pb_num)] = 1
elif command == 'recommend':
flag = int(arg[0])
if flag > 0:
keys = max(re1_dict.keys())
else:
keys = min(re1_dict.keys())
print(keys[1])
else:
pb_num = int(arg[0])
l_num = problem_dict[pb_num]
del problem_dict[pb_num]
del re1_dict[(l_num,pb_num)]
이 문제를 풀때 사실 boj.kr/21944 번을 먼저 풀었기 때문에 그 때 시도했던 후자 방식을 먼저 적용시켜보았다.
제한 시간내에 동작은 하지만 위 풀이는 추천하지 않는다.
문제를 푸는 아이디어는 다음과 같다. 어차피 우리는 recommend를 해야하고, 그때의 값들을 관리하는 것이다.
그러면 이 문제를 풀때 dictinory를 이용하기로 했다.
(난이도, 문제번호)를 key 값으로 하는 dictionary를 만들어준 뒤
recommend를 해줄때 1일때에는 최대값
-1일때는 최소값을 구해서 출력해주는 식으로 했다.
max,min이 알아서 앞에서부터 비교를 해주니 가능한 방식이다.
그리고 문제를 풀었을 때에는
problem_dict 이라는 dictionary에 문제번호와 난이도를 매핑시켜준 딕셔너리가 있다.
그러면 problem_dict에서 solved 된 문제번호를 통해 난이도를 가져오고,
re1_dict의 값을 제거해주면 된다.
import sys
import heapq
input = sys.stdin.readline
def recommend(flag,heap):
flag = -flag
while heap and (heap[0][1]*flag not in problem_dict.keys() or problem_dict[heap[0][1]*flag] != heap[0][0]*flag):
heapq.heappop(heap)
result =heap[0]
result = result[1]*flag
return result
N = int(input())
max_heap = []
min_heap = []
problem_dict = {}
for _ in range(N):
pb_num,l_num = map(int,input().split())
max_heap.append((-l_num,-pb_num))
min_heap.append((l_num,pb_num))
problem_dict[pb_num] = l_num
heapq.heapify(max_heap)
heapq.heapify(min_heap)
M = int(input())
for _ in range(M):
command,*arg = input().split()
if command == 'add':
pb_num,l_num = map(int,arg)
heapq.heappush(max_heap,(-l_num,-pb_num))
heapq.heappush(min_heap,(l_num,pb_num))
problem_dict[pb_num] = l_num
elif command == 'solved':
pb_num = int(arg[0])
del problem_dict[pb_num]
else:
flag = int(arg[0])
if flag > 0:
print(recommend(flag,max_heap))
else:
print(recommend(flag,min_heap))
이게 정석적인 풀이이다.
min_heap 과 max_heap을 이용해서 풀었다.
여기서 주의해야할점은 problem_dict을 활용해 사라진 문제들을 찾아서, 제거를 해주어야한다.
while문을 통해 없는 문제들은 전부 없애주고, while문을 탈출했을때 heap[0]에 있는 값을 return 해주면 된다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 21941 문자열 제거 (0) | 2021.06.11 |
---|---|
[BOJ/백준] 21940 가운데에서 만나기 (0) | 2021.06.11 |
[BOJ/백준] 21938 영상처리 (0) | 2021.06.11 |
[BOJ/백준] 21937 작업 (0) | 2021.06.11 |
[BOJ/백준] 4315 나무 위의 구슬 (0) | 2021.06.11 |