Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 자바
- 트리
- dfs
- 백트래킹
- domain model
- 반효경교수님
- 알고리즘
- 정렬
- Sort
- lcap
- 스택
- SQL
- 매개변수 탐색
- Mendix
- 완전탐색
- algorithm
- 재귀
- 자료구조
- MySQL
- git
- 멘딕스
- 이분탐색
- 해시맵
- 집합
- Recursion
- Bruteforce
- 가중치없는그래프
- 그래프
- 프로그래머스
- microflow
Archives
- Today
- Total
mondegreen
[240220] 알고리즘 리부트 12일차 - 백준 2817 자바 본문
알고리즘 풀이 및 리뷰/[패캠] 핵심유형 20개로 한 번에 끝내는 알고리즘 코딩테스트 리뷰
[240220] 알고리즘 리부트 12일차 - 백준 2817 자바
앙갱 2024. 2. 20. 16:00반응형
[Part1-Chapter04-Clip09]
- 백준 2817 ALPS식 투표
우선순위 큐나 set을 써야하나라는 고민이 들었던 문제였다. 아직 강의 순으로는 해당 자료구조를 배우지 않아서 최대한 배열을 사용하려고 했고 하지만 시간 복잡도를 고려했을 때 가장 높은 점수 순으로 칩을 부여하기 위해서는 적어도 리스트에 담아 정렬할 수밖에 없다는 생각이 들었다. 참가자들의 수가 250만이지만 스태프 수는 10명으로 제한되어 있고 나누는 값도 최대 14까지 적은 수가 반복문을 여러번 돌아도 시간 초과는 나지 않을 것 같았다. 또 칩을 부여하는 과정에서는 내림차순으로 정렬된 수를 각 스태프의 기본 점수로 나누었을 때 나머지가 0.0이면 칩을 부여하는 방식으로 처리했었는데 왜인지 찾을 수 없는 경우가 있어 모든 점수를 반복문으로 순회하면서 부여하는 방식으로 구현했다.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int staff = sc.nextInt();
float[][] votes = new float[26][16];
// 0열 = 총 득표 수
// 15열 = 받은 칩 수
for (int i = 0; i < staff; i++) {
char staffName = sc.next().charAt(0);
int votesNum = sc.nextInt();
if (votesNum >= x * 0.05) { // 득표 수가 5% 인 경우에만 값 넣기
votes[staffName - 'A'][0] = votesNum;
}
}
// 1부터 14로 나눈 실수 구하기
for (int s = 0; s < 26; s++)
for (int i = 1; i <= 14; i++) {
votes[s][i] = (float) (votes[s][0] / i);
}
//리스트에 모든 점수를 넣고
List<Float> scores = new ArrayList<>();
for (int s = 0; s < 26; s++) {
if (votes[s][0] == 0.0) continue;
for (int i = 1; i <= 14; i++) {
scores.add(votes[s][i]);
}
}
// 내림차순으로 정렬
Collections.sort(scores, Collections.reverseOrder());
for (int i = 0; i < 14; i++) {
for (int s = 0; s < 26; s++) {
if (votes[s][0] != 0.0) { // 14번째 점수까지만 돌고
for (int j = 1; j <= 14; j++) {
if (votes[s][j] == scores.get(i)) { // 일치하는 경우
votes[s][15] += 1.0; // 칩 주기
break;
}
}
}
}
}
StringBuilder sb = new StringBuilder();
// 값 출력
for (int s = 0; s < 26; s++) {
if (votes[s][0] == 0.0) continue;
sb.append((char)(s + 65)).append(" " + (int) votes[s][15] + "\n");
}
System.out.println(sb);
}
}
반응형
'알고리즘 풀이 및 리뷰 > [패캠] 핵심유형 20개로 한 번에 끝내는 알고리즘 코딩테스트 리뷰' 카테고리의 다른 글
[240223] 알고리즘 리부트 14일차 - 백준 1181, 1427 자바 (0) | 2024.02.23 |
---|---|
[240222] 알고리즘 리부트 13일차 - 백준 7785 자바 (0) | 2024.02.22 |
[240219] 알고리즘 리부트 11일차 - 백준 2840 자바 (1) | 2024.02.19 |
[240218] 알고리즘 리부트 10일차 - 백준 10250, 1730 자바 (0) | 2024.02.18 |
[240217] 알고리즘 리부트 9일차 - 백준 3085 자바 (0) | 2024.02.17 |