일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 프로젝트
- til
- 완전탐색
- 코딩테스트
- 내일배움캠프
- OOP
- 구현
- 백준
- Spring
- 이분탐색
- ES
- 계산기 만들기
- 누적합
- CSS
- 알고리즘
- Java
- BFS
- web
- SpringBoot
- 브루트포스
- Algorithm
- Generics
- 이분 탐색
- binary search
- 객체지향
- Baekjoon
- programmers
- 프로그래머스
- Elasticsearch
- parametric search
- Today
- Total
개발하는 햄팡이
[JAVA][백준 2817] ALPS식 투표 본문
풀이
시뮬레이션 특...
일단 문제가 잘 이해가 되지 않고....(한번 읽는 것으로는 잘 이해가 되지 않아서 여러번 읽었다.)
구현 자체가 뭔가 할게 많고 조금 복잡한 문제!
조건이 뭐가 많길래 패드에 조건을 하나하나 적어가면서 풀었다.
적은 내용 중 풀이 부분에는
1. 득표 5% 미만 거르기
2. 각 스태프마다 14개의 점수 계산해서 Map에 (점수 : 스태프idx) 저장
3. Map 정렬 후 높은점수 부터 chip 주기 (14개의 점수까지만)
이 정도를 기록하고 문제 풀기 시작!
일단 입출력을 받고 ArrayList<>에 저장을 하려고 했는데 입출력을 보니 A, B, C의 알파벳으로 받고 그 다음 득표수로 들어오길래 Candidate 클래스를 만들어서 ArrayList<Candidate>의 형태로 저장을 했다.
그리고 N이 0부터 오길래 0일때 아무것도 안하고 출력해버리는 코드도 추가!
그 다음에는 14개의 실수 저장하기.
여기서 조금 헤맸는데 Map에 저장을 해야하는건 맞는데 어떻게 저장을 해야 이쁘게 저장했다고 소문이 날까 고민을 많이 해야하는 순간이었다.
Candidate 안에 idx를 집어넣고 그 Cadidate를 그냥 저장해버릴려고 했는데 그렇게 하면 메모리도 더 커지고 idx에 접근하기 위해 한번 더 접근해야하고... 뭐 어차피 인덱스만 접근할거면 인덱스만 저장하면 되지 않나 싶어서 Idx를 저장하는 형태로 했다.
그 다음은 Map을 정렬하고 높은 점수부터 14개 칩 주기
Map을 정렬하려면 따로 entry를 List에 저장해서 정렬해야한다. (귀찮다)
출력도 stringbuffer나 stringBuilder를 이용하면 더 시간을 줄일 수 있지만 12시전에 제출해서 스트릭 안깨지게 해야해서 호다다닥 제출..!
한번에 통과했다 ^-^
갑자기 과정을 적어보고 싶어서 엄청 세세하게 적었는데 블로그 하나 쓰는 것도 참 손이 많이 가는 일이다..!
그래도 이렇게 일기처럼 적어두는 것이 나중에 보면 기억도 세세하게 나고 좋은 것 같다 ^-^
전체 코드
package S_2817;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
private static class Candidate{
char name;
int voteNum;
int chip;
public Candidate(char name, int voteNum) {
this.name = name;
this.voteNum = voteNum;
this.chip = 0;
}
}
private static int X, N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
X = Integer.parseInt(br.readLine()); // 참가자수
N = Integer.parseInt(br.readLine()); // 스태프 수
if (N == 0) {
System.out.println();
return;
}
// 득표수 5% 미만의 자격 없는 스태프를 거른 후보자 명단
ArrayList<Candidate> candidates = new ArrayList<>();
int n = 0;
// 후보자 입력 받기
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
char name = st.nextToken().charAt(0);
int voteNum = Integer.parseInt(st.nextToken());
// isCandidate(voteNum) : 득표 수가 5% 미만인지 아닌지 계산 하는 메소드
if (isCandidate(voteNum)) {
candidates.add(new Candidate(name, voteNum));
}
}
// 각 후보자들의 점수 14개가 담겨져있는 map (점수 : candidates Idx)
Map<Double, Integer> scoresMap = new HashMap<>();
for (int i = 0; i < candidates.size(); i++) {
// 14개의 점수 계산
for (int j = 1; j <= 14; j++) {
double score = calculateScore(j, candidates.get(i).voteNum);
scoresMap.put(score, i);
}
}
// map double 기준 내림차순 정렬
List<Map.Entry<Double, Integer>> sortedScores = new ArrayList<>(scoresMap.entrySet());
sortedScores.sort((entry1, entry2) -> Double.compare(entry2.getKey(), entry1.getKey()));
// 높은 점수부터 14개 칩 주기
for (int i = 0; i < 14; i++) {
candidates.get(sortedScores.get(i).getValue()).chip++;
}
candidates.sort(Comparator.comparing(c -> c.name));
for (Candidate candidate : candidates) {
System.out.println(candidate.name + " " + candidate.chip);
}
}
private static double calculateScore(int n, int voteNum) {
return (double) voteNum / (double) n;
}
private static boolean isCandidate(int voteNum) {
return (double) voteNum / X > 0.05;
}
}
'Algorithm > Baekjoon' 카테고리의 다른 글
[JAVA][백준 2805] 나무 자르기 (1) | 2025.03.01 |
---|---|
[JAVA][백준 16713] Generic Queries (0) | 2025.02.20 |
[JAVA][백준 2840] 행운의 바퀴 (1) | 2024.06.18 |
[JAVA][백준 1730] 판화 (0) | 2024.06.16 |
[JAVA][백준 3085] 사탕 게임 (2) | 2024.06.11 |