hyelie
hyelie
Hyeil Jeong
       
글쓰기    관리    수식입력
  • 전체보기 (495)
    • PS (283)
      • Algorithm (28)
      • PS Log (244)
      • Contest (6)
      • Tips (5)
    • Development (52)
      • Java (14)
      • Spring (23)
      • SQL (2)
      • Node.js (2)
      • Socket.io (3)
      • Study (4)
      • Utils (4)
    • DevOps (36)
      • Git (5)
      • Docker (4)
      • Kubernetes (2)
      • GCP (3)
      • Environment Set Up (8)
      • Tutorial (12)
      • Figma (2)
    • CS (74)
      • OOP (7)
      • OS (24)
      • DB (2)
      • Network (24)
      • Architecture (0)
      • Security (2)
      • Software Design (0)
      • Parallel Computing (15)
    • Project (15)
      • Project N2T (5)
      • Project ASG (0)
      • Project Meerkat (1)
      • Model Checking (7)
      • Ideas (2)
    • 내가 하고싶은 것! (34)
      • Plan (16)
      • Software Maestro (10)
      • 취준 (8)
hELLO · Designed By 정상우.
hyelie

hyelie

PS/PS Log

23.03.29. 풀었던 문제들

Leetcode 1402. Reducing Dishes

Intuition

 문제를 보고, 일단 정렬한 후 뽑기 시작할 시작지점을 고르면 될 것이라 생각했다.

 오름차순 정렬되어 있는 상태에서, 제일 끝 index i를 시작지점으로 여기고 여기부터 시작한다.(제일 끝 index가 제일 큰 값이므로) 이 때, i가 한 칸 앞으로 당겨지면 총 계에 arr[i-1] + arr[i] + ... + arr[n-1]이 더해져야 한다. 이 값을 sum이라고 할 때 sum이 0보다 크다면 i를 한 칸 앞으로 당겨 sum을 maximize할 수 있다. 그러면 sum이 0보다 크면 이것을 반복하면 된다.

 arr[i-1] + ... + arr[n-1]은 prefix sum으로 쉽게 구할 수 있다. 따라서 O(n)으로 풀리는 문제이다.

 

Solution

 intuition에서는 오름차순 정렬되어 있는 상태에서 psum을 사용했다. 그러나 이렇게 말고, 내림차순 정렬되어 있는 상태로 시작하면 arr[0] + ... + arr[i]가 되므로, prefix sum을 사용할 필요가 없다. 앞에서부터 더해주면 되기 때문이다. 마찬가지로 이 값이 0보다 크면 i를 한 칸 더 전진시키면 된다.

// Runtime 0 ms Beats 100%
// Memory 8 MB Beats 98.26%

class Solution {
public:
    int maxSatisfaction(vector<int>& satisfaction) {
        int n = satisfaction.size();
        sort(satisfaction.begin(), satisfaction.end(), greater<int>());

        int sum = 0, idx = -1; // *** 실수 : idx가 없을 때 값이 들어가지 않을 수 있었음.
        // i 값을 구함. arr[0] + ... + arr[i]가 0보다 크면 전진시키도 i를 기억함.
        for(int i = 0; i<n; i++){
            if(sum + satisfaction[i] < 0) break;
            sum += satisfaction[i];
            idx = i;
        }
        
        // 그 i가 optimization value이다. 이 값으로 정답 계산.
        sum = 0;
        for(int i = idx, cnt = 1; i>=0; i--, cnt++){
            sum += satisfaction[i] * cnt;
        }
        return sum;
    }
};

 

시간복잡도

 앞에서부터 제일 뒤까지 순회를 2번 하므로 O(n), 정렬에 O(nlogn)이다.

 

공간복잡도

 주어진 공간 외에 별다른 array를 사용하지 않는다. O(1).

 

후기

 오랜만에 beats 100%다. 기분이 좋군.

 

 

 

 

저작자표시 (새창열림)

'PS > PS Log' 카테고리의 다른 글

23.03.31. 풀었던 문제들  (0) 2023.03.31
23.03.30. 풀었던 문제들  (0) 2023.03.30
23.03.28. 풀었던 문제들  (0) 2023.03.28
23.03.27. 풀었던 문제들  (0) 2023.03.27
23.03.26. 풀었던 문제들  (1) 2023.03.26
    hyelie
    hyelie

    티스토리툴바