본문 바로가기
PS

[자바] 프로그래머스 - 명예의 전당 (1) / 구현 문제 Stream 풀이

by 제이._ 2022. 11. 25.

https://school.programmers.co.kr/learn/courses/30/lessons/138477

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

Level 1, 정답률 38%의 신규 문제입니다.

문제 자체는 쉬우나, 완료자가 많이 없어서 아직은 정답률이 낮아보입니다.


문제 분석

 

문제에서 주어진 예시입니다.

저희가 구해야 하는 것들은 모든 일차 별 발표 점수를 구해야합니다.

 

먼저 명예의 전당에 오를 수 있는 값들의 개수는 k개입니다. 여기에 오를 수 있는 점수는 모든 점수 중 상위 k개입니다.

 

발표 점수 계산은 명예의 전당에 올라가있는 k개의 값들 중 가장 낮은 값으로 선정됩니다.

 

 

 

어떻게 접근하고 풀이할지

문제 풀이를 위해서 우리는 두 가지를 해야 합니다.

1. 명예의 전당에 score[i] 추가하기

2. 내림차순 정렬 후 상위 k개만큼 값 저장하기

3. 명예의 전당에서 가장 낮은 값을 가진 변수를 answer(발표 점수)에 추가해주기

 

이렇게 구현하기 위해 List로 빡구현 하는 방법과, PriorityQueue로 구현하는 방법을 생각했습니다.

하지만 더 간단하게 풀기 위해서 Stream을 적용해서 풀어봤습니다.

 

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

class Solution {
    static public List<Integer> solution(int k, int[] score) {
        List<Integer> answer = new ArrayList<>();
        List<Integer> scoreList = new ArrayList<>();

        for (int i = 0; i < score.length; i++) {
            scoreList.add(score[i]);
            
            scoreList = scoreList.stream()
                .sorted(Comparator.reverseOrder()) // 내림차순
                .limit(k) // 상위 k개 추출
                .collect(Collectors.toList());
            
            answer.add(scoreList.get(scoreList.size() - 1));
        }

        return answer;
    }
}