문제 : https://www.acmicpc.net/problem/1713
1713번: 후보 추천하기
첫째 줄에는 사진틀의 개수 N이 주어진다. (1≤N≤20) 둘째 줄에는 전체 학생의 총 추천 횟수가 주어지고, 셋째 줄에는 추천받은 학생을 나타내는 번호가 빈 칸을 사이에 두고 추천받은 순서대로 �
www.acmicpc.net
문제 유형 : 시뮬레이션, 구현
풀이 방식 : 학생 번호를 담는 사진 틀 Frame 리스트와 해당 학생의 추천수의 student 배열을 이용하여 구현
소스코드
package BOJ;
import java.io.*;
import java.util.*;
public class BOJ_1713_후보추천하기_Main {
public static void main(String[] args) throws NumberFormatException, IOException {
// 1. 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); //사진 틀
List<Integer> Frame = new ArrayList<Integer>();
int input_count = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int[] input = new int[input_count]; // 입력값 넣는 배열
for (int i = 0; i < input_count; i++) {
input[i] = Integer.parseInt(st.nextToken());
}
// 2. 구현
int[] student = new int[101]; // 최대 학생은 100까지 있으므로 학생 추천수
for (int i = 0; i < input_count; i++) {
if(student[input[i]]==0) { // 현재 후보자가 틀에 없을때
if(Frame.size()<N) {
Frame.add(input[i]);
student[input[i]]++;
}else {
int min_student = 0;
int min_student_val = Integer.MAX_VALUE;
int min_student_idx = 0;
for (int j = 0; j < Frame.size(); j++) {
int student_number = Frame.get(j);
if(min_student_val>student[student_number]) {
min_student_val = student[student_number];
min_student = student_number;
min_student_idx = j;
}
}
student[min_student] = 0;
Frame.remove(min_student_idx);
Frame.add(input[i]);
student[input[i]]++;
}
}else { // 현재 후보자가 틀에 있을때
student[input[i]]++;
}
}
//사진틀에 사진이 게재된 최종 후보의 학생 번호를 증가하는 순서대로 출력한기 위한 정렬
Frame.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});
// 3. 출력
for (int i = 0; i < Frame.size(); i++) {
System.out.print(Frame.get(i)+" ");
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[JAVA]백준_10836_여왕벌 (0) | 2020.08.12 |
---|---|
[JAVA]백준_10282_해킹 (0) | 2020.08.12 |
[JAVA]백준_9663_NQueen (4) | 2020.08.06 |
[JAVA]백준_2503_숫자야구 (0) | 2020.08.06 |
[JAVA]백준_3187_양치기꿍 (0) | 2020.08.05 |