[2024] day 131. Leetcode 3075. Maximize Happiness of Selected Children

gunny·2024년 5월 9일
0

코딩테스트

목록 보기
445/530

2024년부터 새롭게 다시 시작하는 코딩테스트

2024년 5월 9일 (목)
Leetcode daily problem

3075. Maximize Happiness of Selected Children

https://leetcode.com/problems/maximize-happiness-of-selected-children/?envType=daily-question&envId=2024-05-09

Problem

길이 n의 happiness 배열과 양의 정수 k가 제공될 때,
happiness 배열의 n은 n명의 아이들이 줄을 서 있고, i번째 아이의 happiness[i]는 happiness value 를 나타낸다.
k 차례에 걸쳐 n명의 어린이 중에서 k명의 어린이를 선택하려고 한다.
매 턴마다 한 아이를 선택하면 지금까지 선택되지 않은 모든 아이의 행복값이 1씩 감소한다. 행복값은 음수가 될 수 없으며 양수일 경우에만 감소한다.

k명의 어린이를 선택하여 달성할 수 있는 선택된 어린이의 행복값의 최대 합을 반환한다.

Solution

sort, greedy

행복값의 최대를 반환해야 하므로, 그리디 알고리즘을 사용하기 위해서
happiness 배열을 내림차순으로 정렬한다.

그 후에, k번만큼 순회하면서 happiness 배열에 있는 원소의 값을 더해가는데, k번 순회하면서의 턴을 따로 업데이트했다가 해당 원소에서 움직이는 턴만큼 빼줘서 감소한 행복 값을 더해줘야 한다.

Code

class Solution:
    def maximumHappinessSum(self, happiness: List[int], k: int) -> int:
        happiness.sort(reverse=True)
        n = 0
        ans = 0
        while k:
            ans += happiness[n]-n if happiness[n]-n >0 else 0
            n+=1
            k-=1
            
        return ans

Complexicity

시간 복잡도

주어진 happiness 배열을 정렬하는 과정에서 O(n log n)이 소요된다. 총 시간복잡도는 O(nlogn)이다.

공간 복잡도

새로운 변수에 상수 개수 만큼 사용하므로 추가 적인 공간은 필요하지 않아 공간 복잡도는 O(1)이다.

profile
꿈꾸는 것도 개발처럼 깊게

0개의 댓글