https://www.acmicpc.net/problem/2817
2817번: ALPS식 투표
첫 번째 줄에는 전대프연 대회에 참가한 참가자들의 수 X( 1 ≤ X ≤ 2,500,000) 이 주어진다. 두 번째 줄에는 전대프연에 참가한 스태프의 수 N (0 ≤ N ≤ 10) 이 주어진다. 다음 N개의 줄에 걸쳐 각
www.acmicpc.net
나는 클래스를 만들지 않았지만 클래스는 만드는 것도 좋은 방법인듯, 파이썬의 튜플처럼 사용할 수 있을 듯하다.
import java.util.*;
import java.io.*;
public class Main
{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int x = Integer.valueOf(br.readLine());
int n = Integer.valueOf(br.readLine());
char[] points = new char[2_500_000];
int[] numbers = new int[26];
boolean[] isCandidate = new boolean[26];
for(int i=0;i<n;i++){
String[] input = br.readLine().split(" ");
if(Integer.valueOf(input[1])*100<x*5) continue;
isCandidate[input[0].charAt(0)-'A']=true;
for(int j=1;j<15; j++){
points[Integer.valueOf(input[1])/j]=input[0].charAt(0);
}
}
int count=0;
for (int i=points.length-1;i>=0;i-- ){
if(count==14) break;
if(points[i]=='\u0000') continue;
count++;
numbers[points[i]-'A']++;
}
for(int i=0; i<26;i++){
if(numbers[i]==0 && isCandidate[i]==false) continue;
bw.write((char)(i+'A')+" "+numbers[i]+"\n");
}
bw.flush();
}
}
정렬하는 코드 한번 봐주기
import java.util.Scanner;
class Main
{
static class Score{
Score(int staffIndex, double scr) {
this.staffIndex = staffIndex;
this.scr = scr;
}
int staffIndex;
double scr;
}
public static void sortScoresDescendingOrder(Score[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < i; j++) {
if (arr[i].scr > arr[j].scr) {
Score cur = arr[i];
for (int k = i; k > j; k--)
arr[k] = arr[k - 1];
arr[j] = cur;
}
}
}
}
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int X = sc.nextInt();
int N = sc.nextInt();
// 1. 전체 득표수의 5% 미만의 스태프를 후보에서 제외한다.
double validCut = X * 0.05;
boolean[] validCandidate = new boolean[26];
int[] staffVote = new int[26];
int candidateCount = 0;
for (int i = 0; i < N; i++) {
String name = sc.next();
int vote = sc.nextInt();
if (vote >= validCut) {
int index = name.charAt(0) - 'A';
validCandidate[index] = true;
staffVote[index] = vote;
candidateCount++;
}
}
// 2. 남은 스태프마다 받은 득표수를 1~14로 나눈 점수 집합을 구한다.
Score[] scores = new Score[candidateCount * 14];
int scoreIndex = 0;
for (int i = 0 ; i < 26; i++) {
if (validCandidate[i]) {
for (int j = 1; j <= 14; j++)
scores[scoreIndex++] = new Score(i, (double)staffVote[i] / j);
}
}
// 3. 전체 점수 집합에서 점수가 큰 1~14번째 스태프에게 칩을 1개씩 지급한다.
sortScoresDescendingOrder(scores);
int[] ans = new int[26];
for (int i = 0; i < 14; i++)
ans[scores[i].staffIndex]++;
// 4. 스태프 이름에 대해 사전순으로 후보 스태프와 받은 칩의 수를 출력한다.
for (int i = 0; i < 26; i++) {
if (validCandidate[i])
System.out.println((char)(i + 'A') + " " + ans[i]);
}
}
}
'Problem Solving > 구현' 카테고리의 다른 글
BOJ1233 주사위 (1) | 2024.02.01 |
---|---|
BOJ2745 진법 변환 (0) | 2024.02.01 |
BOJ2840 행운의 바퀴 (1) | 2024.01.31 |
BOJ1730 판화 (R) (0) | 2024.01.31 |
BOJ10250 ACM 호텔 (0) | 2024.01.31 |