월드초등학교 학생회장 후보는 일정 기간 동안 전체 학생의 추천에 의하여 정해진 수만큼 선정된다. 그래서 학교 홈페이지에 추천받은 학생의 사진을 게시할 수 있는 사진틀을 후보의 수만큼 만들었다. 추천받은 학생의 사진을 사진틀에 게시하고 추천받은 횟수를 표시하는 규칙은 다음과 같다.
후보의 수 즉, 사진틀의 개수와 전체 학생의 추천 결과가 추천받은 순서대로 주어졌을 때, 최종 후보가 누구인지 결정하는 프로그램을 작성하시오.
첫째 줄에는 사진틀의 개수 N이 주어진다. (1 ≤ N ≤ 20) 둘째 줄에는 전체 학생의 총 추천 횟수가 주어지고, 셋째 줄에는 추천받은 학생을 나타내는 번호가 빈 칸을 사이에 두고 추천받은 순서대로 주어진다. 총 추천 횟수는 1,000번 이하이며 학생을 나타내는 번호는 1부터 100까지의 자연수이다.
사진틀에 사진이 게재된 최종 후보의 학생 번호를 증가하는 순서대로 출력한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
List<Info> infos = new ArrayList<>();
List<Integer> answer = new ArrayList<>();
int n = Integer.parseInt(br.readLine());
int m = Integer.parseInt(br.readLine());
boolean isSavedNum;
st = new StringTokenizer(br.readLine());
for (int i = 0; i < m; i++) {
int student = Integer.parseInt(st.nextToken());
if (infos.size() < n) {
isSavedNum = false;
for (Info info : infos) {
if (info.student == student) {
info.cnt++;
isSavedNum = true;
break;
}
}
if (!isSavedNum) infos.add(new Info(i, student, 1));
} else {
Collections.sort(infos);
isSavedNum = false;
for (Info info : infos) {
if (info.student == student) {
info.cnt++;
isSavedNum = true;
break;
}
}
if (!isSavedNum) {
infos.remove(0);
infos.add(new Info(i, student, 1));
}
}
}
for (Info info : infos) {
answer.add(info.student);
}
Collections.sort(answer);
for (Integer val : answer) {
sb.append(val).append(" ");
}
System.out.println(sb.toString());
}
static class Info implements Comparable<Info> {
int index;
int student;
int cnt;
public Info(int index, int student, int cnt) {
this.index = index;
this.student = student;
this.cnt = cnt;
}
@Override
public int compareTo(Info o) {
if (this.cnt == o.cnt) {
return this.index - o.index;
}
return this.cnt - o.cnt;
}
}
}
Comparable
을 통해 커스텀 정렬 방식을 구현했다.