[BOJ] 후보 추천하기

Minsu Han·2023년 6월 14일
0

알고리즘연습

목록 보기
101/105

코드

import sys
# from collections import deque
input = sys.stdin.readline

n = int(input()) # 사진틀 개수
vn = int(input()) # 전체 학생의 추천 횟수
arr = list(map(int, input().split())) # 추천받은 학생들 (순서대로) 

gallery = []    # element: [학생번호, 횟수, 시간]

# 사진틀에 학생 s가 존재하는지 판단
def isExist(s):
    global gallery
    if list(map(lambda x: x[0], gallery)).count(s) > 0: return True

for s in arr:
    # 사진틀에 빈 공간이 있는 경우
    if len(gallery) < n:
        # 사진이 존재하지 않으면 새로 추가
        if not isExist(s):
            gallery.append([s, 1, 0])
        else:
        # 사진이 존재하면 횟수만 증가
            idx = list(map(lambda x: x[0], gallery)).index(s)
            gallery[idx][1] += 1
    # 사진틀이 다 찬 경우
    else:
        # 사진이 존재하지 않으면 가장 횟수가 적으면서 오래 개재된 학생 사진(idx: 0)을 제거
        # 그 후 새 학생을 추가
        if not isExist(s):
            gallery.pop(0)
            gallery.append([s, 1, 0])
        else:
        # 사진이 존재하면 횟수만 증가
            idx = list(map(lambda x: x[0], gallery)).index(s)
            gallery[idx][1] += 1

        # 가장 횟수가 적으면서 오래 개재된 학생 순으로 사진틀을 정렬
        gallery.sort(key=lambda x: (x[1], -x[2]))

    # 사진틀에 개재된 학생들의 개재 시간을 모두 1씩 증가
    gallery = list(map(lambda x: [x[0], x[1], x[2]+1], gallery))

# 정답 출력 (사진틀에 남은 학생 리스트)
print(' '.join(map(str, sorted(list(map(lambda x: x[0], gallery))))))

결과

image

풀이 방법

  • 특별한 알고리즘을 사용하진 않아도 되는 시뮬레이션 문제이다. mapsort 함수를 활용하니 코드가 간단해졌다.
  • 자세한 구현 방법은 주석을 활용했다

profile
기록하기

0개의 댓글