-
[프로그래머스] 과일 장수 자바 최소값 계산 : 내림차순 정렬코딩테스트 2025. 4. 1. 17:48반응형
https://school.programmers.co.kr/learn/courses/30/lessons/135808
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
점수 목록 score 을 m개씩 묶어서 최소값 * m 값을 answer에 더하여 반환하라.
접근
public int solution(int k, int m, int[] score) { Arrays.sort(score); int [][] boxes = new int[score.length / m][m]; int boxCnt = 0; for(int i = 0; i < score.length; i += m){ int[] box = new int[m]; if(i > score.length - m){ i = score.length - m; boxCnt = 0; } int tempI = i; for(int j = 0; j < box.length; j++){ box[j] = score[tempI]; if(tempI < score.length -1){ tempI ++; } } boxes[boxCnt] = box; boxCnt ++; } //상자 내용 계산 int answer = 0; for (int[] box : boxes) { int minPoint = Integer.MAX_VALUE; for (int i : box) { minPoint = Math.min(minPoint, i); } answer += minPoint * m; } return answer; }
발견된 문제
1.배열 인덱스 처리 오류:
i > score.length - m 조건에서 i = score.length - m로 강제 설정하면 중복된 상자가 생성될 수 있습니다.
마지막 상자의 시작 인덱스 계산이 부정확합니다.
2.불필요한 2차원 배열 사용:
상자 정보를 저장할 필요 없이 바로 점수를 계산할 수 있습니다.
3.정렬 방향 문제:
현재는 오름차순 정렬이지만, 내림차순 정렬이 더 적합합니다.수정
1. 기존의 오름차순 정렬을 내림차순 정렬로 변경
2. 반복문 횟수를 줄이기 위해 i <= score.length - m; i += m 으로 처리하며 바로 최소값을 구해 연산하도록 수정.public int solution(int k, int m, int[] score){ int answer = 0; Integer[] scoreNew = Arrays.stream(score).boxed().toArray(Integer[]::new); Arrays.sort(scoreNew, Collections.reverseOrder()); // m개씩 묶어서 최소값 계산 for( int i = 0; i <= scoreNew.length - m; i += m){ int min = scoreNew[i + m - 1]; answer += min * m; } return answer; }
알게 된 점
배열을 내림차순 정렬하면, 가장 끝 값이 최소값이다 라는 발상이 신기했다.
또, 내림차순을 하려면 int[]을 직접할 순 없고 Integer[]로 변환해주어야 한다.반응형'코딩테스트' 카테고리의 다른 글
[프로그래머스] 햄버거 만들기 자바 : 스택 (0) 2025.04.01 [프로그래머스] 푸드 파이트 대회 자바 (0) 2025.04.01 [프로그래머스] 기사단의 무기 자바. 모든 숫자의 약수의 개수 구하기 (0) 2025.04.01 [프로그래머스] 명예의 전당 (1) 자바, 최소값, 정렬 (0) 2025.03.31 [프로그래머스] 문자열 나누기 자바 (0) 2025.03.31