일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 오라클
- jsp 프로젝트
- 고객센터 구현
- Spring
- 스프링
- 코딩
- Sts
- 자바
- json
- 교보문고 따라하기
- 대분류/중분류/소분류
- java
- MySQL
- SESSION
- 인증코드로 비밀번호 변경 구현
- jsp
- 로그인과 장바구니 구현
- 다중 카테고리 구현
- 이메일로 인증코드 전송 구현
- 일단_해보는거야
- MVC
- jakarta.mail
- 세션
- 프로그래머스
- jquery
- Oracle
- Spring MVC
- js
- Level 1
- ajax
감 잃지말고 개발하기
[프로그래머스] [JAVA] [Java] [Level 1] [정렬하기] 과일 장수 본문
문제
과일 장수가 사과 상자를 포장하고 있다.
사과는 상태에 따라 1점부터 k점까지의 점수로 분류하며, k점이 최상품의 사과이고 1점이 최하품의 사과이다.
사과 한 상자의 가격은 다음과 같이 결정된다.
- 한 상자에 사과를 m 개씩 담아 포장한다.
- 상자에 담긴 사과 중 가장 낮은 점수가 p (1 ≤ p ≤ k)점인 경우, 사과 한 상자의 가격은 p * m이다.
과일 장수가 가능한 많은 사과를 팔았을 때, 얻을 수 있는 최대 이익을 계산하고자 한다.
이때, 사과는 상자 단위로만 판매하며, 남는 사과는 버린다.
예를 들어, k = 3, m = 4, 사과 7개의 점수가 [1, 2, 3, 1, 2, 3, 1]이라면, 다음과 같이 [2, 3, 2, 3]으로 구성된 사과 상자 1개를 만들어 판매하여 최대 이익을 얻을 수 있다.
- (최저 사과 점수) x (한 상자에 담긴 사과 개수) x (상자의 개수) = 2 x 4 x 1 = 8
사과의 최대 점수 k, 한 상자에 들어가는 사과의 수 m, 사과들의 점수 score가 주어졌을 때, 과일 장수가 얻을 수 있는 최대 이익을 리턴하는 함수를 완성하시오.
접근방법
1. 사과들의 점수 score 배열을 역으로 정렬시키기 위해 java.util.Collections 클래스의 reverseOrder() 사용
2. 최대이익 상자를 구하기 위해 상자 개수만큼 for문 사용
3. 최대이익 상자(배열)를 구하기 위해 java.util.Arrays 클래스의 copyOfRange()를 사용해 역정렬한 score 배열에서 m 요소만큼씩 복사
해결
import java.util.Arrays;
import java.util.Collections;
class Solution {
public int solution(int k, int m, int[] score) {
// 0. 상자 최대 이익을 구할 전역 변수 선언
int answer = 0;
// 1. score 배열 DESC 정렬
Integer newscore[] = Arrays.stream(score).boxed().toArray(Integer[]::new);
Arrays.sort(newscore,Collections.reverseOrder());
// 2. 상자에 담을 개수(k)만큼의 상자 개수 구하기
int boxCount = (int)newscore.length / m;
// 3. 상자에 담을 사과 소분하기(최대이익 상자 구하기)
for(int i=0; i<boxCount*m; i+=m) {
Integer[] boxArray = new Integer[m];
boxArray = Arrays.copyOfRange(newscore, i, i+m);
int p = boxArray[m-1];
// 4. 상자 최대 이익 구하기
answer += p * m;
}
return answer;
}
}
코드 설명
▶ 주석 3
♣ 추가 설명 ♣
1. java.util.Collections 클래스의 reverseOrder() 메서드
- 배열을 내림차순으로 정렬할 때 사용하는 메서드
- 만약 기본 타입 배열을 내림차순으로 정렬하고 싶다면 기본 타입의 배열을 래퍼클래스로 만들어 Comparator를 두 번째 인자에 넣어주어야 역순으로 정렬할 수 있다
2. 기본 타입 배열을 래퍼클래스 배열로 변환하기
int 타입의 배열 score를 래퍼클래스인 Integer 타입의 배열로 변환
- Integer newscore[ ] = Arrays.stream(score).boxed().toArray(Integer[ ]::new);
3. java.util.Arrays 클래스의 copyOfRange() 메서드
Arrays 클래스는 배열을 조작할 수 있는 메서드를 가진 클래스이다
이 클래스의 copyOfRange() 메서드를 이용하면 복사할 배열의 시작점(인덱스)과 끝점을 지정하여 배열의 깊은 복사를 할 수 있다
- Arrays.copyOfRange(복사할 배열, 복사 시작점, 끝점);
Ex. Arrays.copyOfRange(a, 1, 4);
a 배열에서 [1] ~ [3] 인덱스 요소를 복사하게 된다
'프로그래머스 > JAVA' 카테고리의 다른 글
[프로그래머스] [JAVA] [Java] [Level 1] [문자열 처리] 푸드 파이트 대회 (0) | 2023.03.02 |
---|---|
[프로그래머스] [JAVA] [Level 1] [약수 구하기] 기사단원의 무기 (0) | 2022.12.28 |
[프로그래머스] [JAVA] [Level 1] 가장 가까운 동일 문자 찾기 (0) | 2022.12.23 |