칠무해

이윤설·2024년 4월 1일
post-thumbnail

제출코드


import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 학생 수 N 입력 받기
        int N = scanner.nextInt();
        
        // 학생들의 성적을 저장할 리스트
        ArrayList<Double> scores = new ArrayList<Double>();
        
        // N번 반복하며 성적 입력 받기
        for (int i = 0; i < N; i++) {
            double score = scanner.nextDouble();
            scores.add(score);
        }
        
        // 성적 리스트를 오름차순으로 정렬
        Collections.sort(scores);
        
        // 하위 7명의 성적 출력
        for (int i = 0; i < 7; i++) {
            System.out.printf("%.3f\n", scores.get(i));
        }
        
        scanner.close();
    }
}

  • 메모리 초과가 발생한다.

모범답안

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int repetition = Integer.parseInt(br.readLine());

        PriorityQueue<Double> minHeap = new PriorityQueue<>(Collections.reverseOrder());
        for (int i = 0; i < repetition; i++) {
            double score = Double.parseDouble(br.readLine());

            //힙에 성적 추가
            minHeap.add(score);

            // 힙의 크기가 8이 되면 가장 높은 성적을 가진 학생 제거
            if (minHeap.size() > 7) {
                minHeap.poll();
            }
        }

        // 결과 출력을 위해 힙을 배열로 변환
        Double[] result = minHeap.toArray(new Double[0]);
        
        // 배열을 오름차순으로 정렬
        Arrays.sort(result);

        // 하위 7명의 성적 출력
        for (double score : result) {
            System.out.printf("%.3f\n", score);
        }

        br.close();
    }
}

배운점

  • 모든 학생의 성적을 저장하는 대신에, 최소 힙(min heap) 자료구조를 사용하여 하위 7명의 성적만을 유지할 수 있다.

  • PriorityQueue를 최소 힙으로 활용할 수 있다.
    이 방법을 사용하면, 언제든지 힙의 크기를 7로 유지하면서, 낮은 성적부터 차례대로 제거할 수 있으므로, 메모리 사용량을 크게 줄일 수 있다.

profile
화려한 외면이 아닌 단단한 내면

0개의 댓글