개발하는 햄팡이

[JAVA][백준 2817] ALPS식 투표 본문

Algorithm/Baekjoon

[JAVA][백준 2817] ALPS식 투표

hampangee 2024. 6. 19. 00:02

풀이

시뮬레이션 특...
일단 문제가 잘 이해가 되지 않고....(한번 읽는 것으로는 잘 이해가 되지 않아서 여러번 읽었다.)
구현 자체가 뭔가 할게 많고 조금 복잡한 문제!

조건이 뭐가 많길래 패드에 조건을 하나하나 적어가면서 풀었다.

 

 

적은 내용 중 풀이 부분에는
1. 득표 5% 미만 거르기
2. 각 스태프마다 14개의 점수 계산해서 Map에 (점수 : 스태프idx) 저장
3. Map 정렬 후 높은점수 부터 chip 주기 (14개의 점수까지만)


이 정도를 기록하고 문제 풀기 시작!

어떻게 풀지 생각해보며 끄적였던 메모

 

 

 

 

 

일단 입출력을 받고 ArrayList<>에 저장을 하려고 했는데 입출력을 보니 A, B, C의 알파벳으로 받고 그 다음 득표수로 들어오길래 Candidate 클래스를 만들어서 ArrayList<Candidate>의 형태로 저장을 했다.

그리고 N이 0부터 오길래 0일때 아무것도 안하고 출력해버리는 코드도 추가!

main 메소드
Candidate 클래스

 

간단한 계산이지만 그냥 깔끔하게 하고 싶어서 메소드로 뺐다.

 

 

그 다음에는 14개의 실수 저장하기.
여기서 조금 헤맸는데 Map에 저장을 해야하는건 맞는데 어떻게 저장을 해야 이쁘게 저장했다고 소문이 날까 고민을 많이 해야하는 순간이었다.
Candidate 안에 idx를 집어넣고 그 Cadidate를 그냥 저장해버릴려고 했는데 그렇게 하면 메모리도 더 커지고 idx에 접근하기 위해 한번 더 접근해야하고... 뭐 어차피 인덱스만 접근할거면 인덱스만 저장하면 되지 않나 싶어서 Idx를 저장하는 형태로 했다.

메소드 추출 할 수 있는데 왜 안하냐는 intelliJ 거슬린다....
얘도 깔끔해보일려고 뺀 메소드

 

 

그 다음은 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