1713번: 후보 추천하기
첫째 줄에는 사진틀의 개수 N이 주어진다. (1 ≤ N ≤ 20) 둘째 줄에는 전체 학생의 총 추천 횟수가 주어지고, 셋째 줄에는 추천받은 학생을 나타내는 번호가 빈 칸을 사이에 두고 추천받은 순서대
www.acmicpc.net
분류
- 구현
- 시뮬레이션
문제
월드초등학교 학생회장 후보는 일정 기간 동안 전체 학생의 추천에 의하여 정해진 수만큼 선정된다. 그래서 학교 홈페이지에 추천받은 학생의 사진을 게시할 수 있는 사진틀을 후보의 수만큼 만들었다. 추천받은 학생의 사진을 사진틀에 게시하고 추천받은 횟수를 표시하는 규칙은 다음과 같다.
- 학생들이 추천을 시작하기 전에 모든 사진틀은 비어있다.
- 어떤 학생이 특정 학생을 추천하면, 추천받은 학생의 사진이 반드시 사진틀에 게시되어야 한다.
- 비어있는 사진틀이 없는 경우에는 현재까지 추천 받은 횟수가 가장 적은 학생의 사진을 삭제하고, 그 자리에 새롭게 추천받은 학생의 사진을 게시한다. 이때, 현재까지 추천 받은 횟수가 가장 적은 학생이 두 명 이상일 경우에는 그러한 학생들 중 게시된 지 가장 오래된 사진을 삭제한다.
- 현재 사진이 게시된 학생이 다른 학생의 추천을 받은 경우에는 추천받은 횟수만 증가시킨다.
- 사진틀에 게시된 사진이 삭제되는 경우에는 해당 학생이 추천받은 횟수는 0으로 바뀐다.
후보의 수 즉, 사진틀의 개수와 전체 학생의 추천 결과가 추천받은 순서대로 주어졌을 때, 최종 후보가 누구인지 결정하는 프로그램을 작성하시오.
입력
첫째 줄에는 사진틀의 개수 N이 주어진다. (1 ≤ N ≤ 20) 둘째 줄에는 전체 학생의 총 추천 횟수가 주어지고, 셋째 줄에는 추천받은 학생을 나타내는 번호가 빈 칸을 사이에 두고 추천받은 순서대로 주어진다. 총 추천 횟수는 1,000번 이하이며 학생을 나타내는 번호는 1부터 100까지의 자연수이다.
출력
사진틀에 사진이 게재된 최종 후보의 학생 번호를 증가하는 순서대로 출력한다.
풀이
- 조건을 보고 하나씩 구현해나가면 되는 문제
- 먼저 추천을 받은 사람은 무조건 사진이 게시되어야 한다.
- 따라서 사진틀에 남은자리가 있느는지 확인하고 남아있다면 바로 append하고 남은 자리가 없다면 그중 최소 추천수를 가진 사람을 제거하고 append한다.
- 만약 최소 추천수를 가진 사람이 다수라면 제일 먼저 게시된 사람의 사진을 제거한다.
- 이미 사진이 게시된 사람이 추천을 받을 경우 추천수만 늘린다.
코드
N = int(input())
M = int(input())
arr = list(map(int, input().split()))
result = []
for i in arr:
# result배열에서 i가 존재하는지 확인한다.
# 없는 경우
if i not in [x[0] for x in result]:
# 정해진 사진틀의 개수보다 적게 있다면 바로 append한다.
if len(result) < N:
result.append([i, 1])
# 이미 모든 사진틀이 채워져있다면 추천 수 기준으로 정렬하고 최소값을 제거한 후 새로운 값을 append한다.
else:
mn = min(result, key=lambda x: x[1])
result.remove(mn)
result.append([i, 1])
# i가 있는 경우 추천수 +1
else:
for j in range(len(result)):
if result[j][0] == i:
result[j][1] += 1
break
result.sort()
for i in result:
print(i[0], end=' ')
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 14503번] 로봇 청소기 - 파이썬(python) (0) | 2023.06.15 |
---|---|
[백준 1913번] 달팽이 - 파이썬(python) (0) | 2023.06.13 |
[백준 7569번] 토마토 - 파이썬(python) (0) | 2023.06.01 |
[벡준 2667번] 단지번호 붙이기 - 파이썬(python) (0) | 2023.06.01 |
[백준 2468번] 안전영역 - 파이썬(python) (0) | 2023.05.30 |
댓글