🧩 문제
https://school.programmers.co.kr/learn/courses/30/lessons/135808
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡 내가 작성한 코드
import java.util.*;
class Solution {
public int solution(int k, int m, int[] score) {
int answer = 0;
Integer[] list = Arrays.stream(score).boxed().toArray(Integer[]::new);
Arrays.sort(list, Collections.reverseOrder());
for(int i = 0; i < list.length; i++) {
if((i + 1) % m == 0) answer += (list[i] * m);
}
return answer;
}
}
- 내림차순으로 정렬하기 위해 `Collections.reverseOrder()`를 사용하려면 `int[]` 배열을 `Integer[]` 배열로 반환해야 함
- `Arrays.<T>sort(T[], java.util.Comparator<? super T>)` 에서 T가 원시 타입(int, float, char 등..)을 지원하지 않기 때문에, Object 타입으로 변경해주어야 함
- 내림차순으로 정렬된 배열을 순회하면서
- `(i + 1) % m == 0`인 경우, 즉 m번째 (내림차순으로 정렬했기 때문에 m으로 나누어지는 자리에 위치한 사과가 m개의 사과중 최저 사과 점수) 사과마다 그 사과의 점수에 m을 곱해 answer에 합산
- 결과
- 테스트는 전부 통과하였지만, int 배열을 Integer 배열로 변환한 후 내림차순 정렬을 하여서 불필요한 연산이 추가되어 성능이 저하되었다.
💡 좀 더 성능이 최적화 된 코드
import java.util.*;
class Solution {
public int solution(int k, int m, int[] score) {
int answer = 0;
Arrays.sort(score);
for(int i = score.length; i >= m; i -= m){
answer += score[i - m] * m;
}
return answer;
}
}
- 기존 코드는 내림차순 정렬을 하였다면, 현재 코드는 score 배열을 타입 변경 없이 오름차순 정렬하는 것으로 변경
- 배열의 끝에서부터 m씩 건너뛰며 순회
- 각 m번째 사과의 점수에 m을 곱해 answer에 합산
- 내림차순 정렬 후 m번째 사과를 선택하는 코드와 동일한 결과
- 결과
- 불필요한 연산을 제거하여서 첫번째 코드보다 시간이 단축된 것을 확인할 수 있다.
🧠 배운 점
- 성능 최적화
- 첫 번째 코드에서는 int 배열을 Integer 배열로 변환한 후 내림차순 정렬
- 하지만 이는 불필요한 연산을 추가하여 성능을 저하
- 두 번째 코드에서는 이러한 변환 없이 오름차순 정렬을 한 후 단순하게 계산하여 성능을 최적화
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 자바(Java) - 예상 대진표 (0) | 2024.06.07 |
---|---|
[프로그래머스] 자바(Java) - 구명보트 (0) | 2024.06.06 |
[프로그래머스] 자바(Java) - 모의고사 (0) | 2024.05.30 |
[프로그래머스] 자바(Java) - 폰켓몬 (0) | 2024.05.23 |
[프로그래머스] 자바(Java) - 2016년 (0) | 2024.05.18 |