https://www.acmicpc.net/problem/1713
월드초등학교 학생회장 후보는 일정 기간 동안 전체 학생의 추천에 의하여 정해진 수만큼 선정된다. 그래서 학교 홈페이지에 추천받은 학생의 사진을 게시할 수 있는 사진틀을 후보의 수만큼 만들었다. 추천받은 학생의 사진을 사진틀에 게시하고 추천받은 횟수를 표시하는 규칙은 다음과 같다.
후보의 수 즉, 사진틀의 개수와 전체 학생의 추천 결과가 추천받은 순서대로 주어졌을 때, 최종 후보가 누구인지 결정하는 프로그램을 작성하시오.
1 ≤ N ≤ 20
총 추천 횟수는 1,000번 이하이며 학생을 나타내는 번호는 1부터 100까지의 자연수이다.
단순 구현으로 풀었다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int m = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
br.close();
int[] recommendArr = new int[m];
for (int i = 0; i < m; i++) {
recommendArr[i] = Integer.parseInt(st.nextToken());
}
solution(n, recommendArr);
}
private static void solution(int n, int[] recommendArr) {
int[] recommendInfo = new int[recommendArr.length + 1];
Queue<Integer> queue = new LinkedList<>();
for (int recommend : recommendArr) {
//새로운 후보 등장
if (recommendInfo[recommend] == 0) {
//액자 자리가 다 찼으면
if (queue.size() == n) {
int size = queue.size();
Integer[] min = new Integer[] {null, null};
for (int i = 0; i < size; i++) {
Integer student = queue.poll();
if (min[0] == null || min[1] > recommendInfo[student]) {
min[0] = student;
min[1] = recommendInfo[student];
}
queue.add(student);
}
for (int i = 0; i < size; i++) {
Integer student = queue.poll();
if (Objects.equals(student, min[0])) {
recommendInfo[student] = 0;
continue;
}
queue.add(student);
}
}
queue.add(recommend);
}
recommendInfo[recommend] += 1;
}
List<Integer> list = queue.stream().sorted().collect(Collectors.toList());
StringBuilder sb = new StringBuilder();
for (Integer num : list) {
sb.append(' ').append(num);
}
sb.deleteCharAt(0);
System.out.println(sb);
}
}