[99클럽 코테 스터디] 23일차 TIL - Array Partition

Hoxy?·2024년 8월 13일
0

99클럽 코테 스터디

목록 보기
23/42
post-thumbnail

오늘의 학습 키워드

</> 탐욕법(Greedy Algorithm)

공부한 내용 본인의 언어로 정리하기

class Solution {
    public int arrayPairSum(int[] nums) {
         Arrays.sort(nums);
        int sum = 0;
        for (int i = 0; i < nums.length; i += 2) {
            sum += nums[i];
        }
        return sum;
    }
}

오늘의 회고

오늘 문제는 보자마자 풀이 방법이 바로 생각나서 시작했다.
첫 마주함과 동시에 오름차순 정렬 후 2개씩 묶어서 최소 값을 구해서 더하면 되겠다고 생각했는데 배열 만들기가 좀 귀찮은데? 라는 생각을 하다가 저번에 문제에서 비슷한 느낌의 풀이가 있었던 것 같아 돌아보니 순서에 맞게 내가 필요한 순서의 인덱스 값만 가져오면 되잖아?라는 답이 떠올랐다. 그리고 풀이를 작성했다.
1. 배열을 오름차순으로 만든다.
2. 홀수번째의 인덱스값을 가져오면 최소의 희생으로 최대합을 만들 수 있다.
3. 모두 더하고 반환한다.

Arrays.sort(nums);
for(int i = 0; i < nums.length; i += 2){

}
int sum = 0;

for(int i = 0; i < nums.length; i += 2){
	sum += nums[i];
}

return sum;

오늘 문제는 복습을 열심히 한 보람이 느껴지는 문제였다.

AI 코드리뷰

현재 코드의 장점

  1. 간단하고 이해하기 쉬운 구현
  2. Arrays.sort()를 사용하여 효율적인 정렬 수행
  3. 짝수 인덱스만 순회하여 불필요한 연산 최소화

현재 코드의 단점

  1. 원본 배열을 변경함 (정렬 과정에서)
  2. 추가 메모리 사용 없음 (in-place 정렬)

시간 복잡도

  • 시간 복잡도: O(n log n) - Arrays.sort()의 평균 시간 복잡도
  • 공간 복잡도: O(1) - 추가 공간을 사용하지 않음

개선 제안

  1. 원본 배열을 유지해야 하는 경우, 복사본을 만들어 정렬
  2. 정렬 대신 다른 방법을 사용하여 시간 복잡도 개선 가능

개선된 코드 제안

class Solution {
    public int arrayPairSum(int[] nums) {
        int[] count = new int[20001];
        for (int num : nums) {
            count[num + 10000]++;
        }
        
        int sum = 0;
        boolean isEven = true;
        for (int i = 0; i < 20001; i++) {
            while (count[i] > 0) {
                if (isEven) {
                    sum += i - 10000;
                }
                isEven = !isEven;
                count[i]--;
            }
        }
        return sum;
    }
}

개선된 버전의 장점

  1. 시간 복잡도 개선 (O(n + k), k는 숫자의 범위)
  2. 원본 배열 유지
  3. 정렬 없이 문제 해결

개선된 버전의 단점

  1. 추가 메모리 사용 (카운팅 배열)
  2. 숫자 범위가 제한적일 때만 효율적

시간 복잡도

  • 시간 복잡도: O(n + k), 여기서 k는 숫자의 범위 (20001)
  • 공간 복잡도: O(k)

내일 공부할 것 :

  1. 정렬 알고리즘들 (퀵소트, 머지소트, 힙소트 등)과 그들의 시간/공간 복잡도
  2. 카운팅 정렬과 그 응용
  3. 투 포인터 기법
  4. 비트 연산을 이용한 최적화 기법

문제

https://leetcode.com/problems/array-partition/description/

profile
하나부터 열까지 모든 것이 궁금한 개발자 취준생

0개의 댓글