STUDY/Algorithm

[백준] 1713 후보추천하기

sinawi95 2021. 2. 23. 23:09
728x90

https://acmicpc.net/problem/1713 

 

1713번: 후보 추천하기

첫째 줄에는 사진틀의 개수 N이 주어진다. (1≤N≤20) 둘째 줄에는 전체 학생의 총 추천 횟수가 주어지고, 셋째 줄에는 추천받은 학생을 나타내는 번호가 빈 칸을 사이에 두고 추천받은 순서대로

www.acmicpc.net

import sys
input = sys.stdin.readline

n = int(input()) # photo
r = int(input()) # total recommend, r <= 1000
r_list = list(map(int, input().split()))

r_dict = dict()
photo = []
for recommend in r_list:
    if len(photo) < n:
        if recommend not in r_dict:
            r_dict[recommend] = 1
            photo.append(recommend)
        else:
            r_dict[recommend] += 1

    else:
        if recommend in photo:
            r_dict[recommend] += 1
        else:
            min_tmp = min([r_dict[photo[idx]] for idx in range(n)])
            for idx, pht in enumerate(photo):
                if r_dict[pht] == min_tmp:
                    r_dict[pht] = 0
                    photo.pop(idx)
                    break
            photo.append(recommend)
            if recommend not in r_dict:
                r_dict[recommend] = 1
            else:
                r_dict[recommend] += 1

print(' '.join(map(str, sorted(photo))))

다른 문제에 비해 조금 어렵긴한데 그래도 할만하다. a형에 비하면 그냥 어린애 장난감 수준

문제를 보면 조건을 그대로 적었고, 조금 어려웠던? 귀찮았던? 조건은 3번이다.

  1. 비어있는 사진틀이 없는 경우에는 현재까지 추천 받은 횟수가 가장 적은 학생의 사진을 삭제하고, 그 자리에 새롭게 추천받은 학생의 사진을 게시한다. 이때, 현재까지 추천 받은 횟수가 가장 적은 학생이 두 명 이상일 경우에는 그러한 학생들 중 게시된 지 가장 오래된 사진을 삭제한다.

추천 받은 횟수를 적어놓기 위해 딕셔너리를 만들었고, 사진틀 위에 올라간 학생중 가장 적은 추천수를 찾아내었으며, 그 추천수에 해당하는 학생을 제거하였다.

가장 오래된 사진은 사진틀에 올라간 순서대로이므로 index로 값을 찾으면 자연스레 가장 오래된게 빠져 나오게된다.

 


열한시니까 오늘은 일찍잘수있겠다

Dog Honey...