반응형
문제
월드초등학교 학생회장 후보는 일정 기간 동안 전체 학생의 추천에 의하여 정해진 수만큼 선정된다. 그래서 학교 홈페이지에 추천받은 학생의 사진을 게시할 수 있는 사진틀을 후보의 수만큼 만들었다. 추천받은 학생의 사진을 사진틀에 게시하고 추천받은 횟수를 표시하는 규칙은 다음과 같다.
- 학생들이 추천을 시작하기 전에 모든 사진틀은 비어있다.
- 어떤 학생이 특정 학생을 추천하면, 추천받은 학생의 사진이 반드시 사진틀에 게시되어야 한다.
- 비어있는 사진틀이 없는 경우에는 현재까지 추천 받은 횟수가 가장 적은 학생의 사진을 삭제하고, 그 자리에 새롭게 추천받은 학생의 사진을 게시한다. 이때, 현재까지 추천 받은 횟수가 가장 적은 학생이 두 명 이상일 경우에는 그러한 학생들 중 게시된 지 가장 오래된 사진을 삭제한다.
- 현재 사진이 게시된 학생이 다른 학생의 추천을 받은 경우에는 추천받은 횟수만 증가시킨다.
- 사진틀에 게시된 사진이 삭제되는 경우에는 해당 학생이 추천받은 횟수는 0으로 바뀐다.
후보의 수 즉, 사진틀의 개수와 전체 학생의 추천 결과가 추천받은 순서대로 주어졌을 때, 최종 후보가 누구인지 결정하는 프로그램을 작성하시오.
입력
첫째 줄에는 사진틀의 개수 N이 주어진다. (1 ≤ N ≤ 20) 둘째 줄에는 전체 학생의 총 추천 횟수가 주어지고, 셋째 줄에는 추천받은 학생을 나타내는 번호가 빈 칸을 사이에 두고 추천받은 순서대로 주어진다. 총 추천 횟수는 1,000번 이하이며 학생을 나타내는 번호는 1부터 100까지의 자연수이다.
출력
사진틀에 사진이 게재된 최종 후보의 학생 번호를 증가하는 순서대로 출력한다.
예제 입력 1
3
9
2 1 4 3 5 6 2 7 2
예제 출력 1
2 6 7
소스코드
import java.util.Arrays;
import java.util.Scanner;
public class Main {
private static int N;
private static int Total;
private static int student[]=new int[101]; // 추천받은 횟수
private static int nominate[]; // 사진틀에 게시된 학생 번호 저장
private static int num[]; // 추천받은 학생의 번호
private static int time[]=new int[101]; // 추천받은 시간(이미 게시된 경우 시간을 갱신하지 않도록 주의)
private static int cnt=0; // 게시된 사진 개수
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N=sc.nextInt();
Total=sc.nextInt();
nominate=new int[N];
num=new int[Total];
for(int i=0;i<Total;i++) {
boolean isNominate=false;
num[i]=sc.nextInt();
for(int x:nominate) { // 이미 게시되어 있는 경우
if(x==num[i]) {
student[x]++;
isNominate=true;
break;
}
}
if(!isNominate) { // 아직 게시되지 않은 경우
time[num[i]]=i+1;
if(cnt<N) { // 게시 가능한 사진틀이 남아있는 경우
student[num[i]]++;
nominate[cnt++]=num[i];
} else { // 게시 가능한 사진틀이 없는 경우
int temp=0;
for(int j=1;j<N;j++) {
if(student[nominate[temp]]>student[nominate[j]]) { // 현재까지 추천 받은 횟수가 가장 적은 학생 찾기
temp=j;
} else if(student[nominate[temp]]==student[nominate[j]]) { // 현재까지 추천 받은 횟수가 가장 적은 학생이 2명 이상인 경우
if(time[nominate[temp]]>time[nominate[j]]) { // 게시된지 더 오래된 학생 찾기
temp=j;
}
}
}
student[nominate[temp]]=0; // 게시된 사진을 삭제하는 경우 추천 횟수 0으로 초기화하기
nominate[temp]=num[i]; // 새로 게시될 사진 등록
student[nominate[temp]]++;
}
}
}
Arrays.sort(nominate); // 게시된 학생의 번호 오름차순 정렬
for(int x:nominate) {
if(x!=0) System.out.print(x+" ");
}
}
}
반응형
'코딩테스트 > 구현(Implementation)' 카테고리의 다른 글
[Java] 백준 16927번 : 배열 돌리기 2 (0) | 2022.02.09 |
---|---|
[Java] 백준 2456 : 나는 학급회장이다 (0) | 2022.01.26 |
[Java] 백준 2615 : 오목 (0) | 2022.01.24 |
[Java] 백준 2621번 : 카드게임 (0) | 2022.01.23 |
[Java] 백준 16926번 : 배열 돌리기 1 (0) | 2022.01.21 |