th42500의 TIL

[Java] 연습문제 - 최솟값 만들기 (Lv2) 본문

Algorithm/Programmers

[Java] 연습문제 - 최솟값 만들기 (Lv2)

th42500 2022. 8. 3. 02:09

https://school.programmers.co.kr/learn/courses/30/lessons/12941

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

✔ 입출력 예시

최솟값 만들기 입출력 예시

 

 

💡 포인트

1️⃣ 최종적으로 누적된 최솟값이 적기 위해서는 작은 수 * 큰 수를 누적해야 함

 

 

1️⃣ 첫번째 시도

❓ 풀이과정

    👉 배열 A를 오름차순으로 정렬, 배열 B를 Integer배열로 변환하여 내림차순으로 정렬한 후 각 배열의 동일 인덱스

          값끼리 곱하여 누적

❗ 결과

    👉 정확성 테스트에 있어서는 모두 통과했으나 효율성 테스트 1번에서 시간 초과

1차 시도 정확성 테스트 통과
효율성 테스트 1번 시간 초과

✔ 소스코드

import java.util.Arrays;
import java.util.Collections;

public class Solution { // 최솟값 만들기

	public static void main(String[] args) {
//		int[] A = { 1, 4, 2 };
//		int[] B = { 5, 4, 4 };
		int[] A = {1, 2};
		int[] B = {3, 4};

		System.out.println(solution(A, B));
	}

	private static int solution(int[] A, int[] B) {
		int answer = 0;
		
		Arrays.sort(A);
		Integer[] b = Arrays.stream(B).boxed().toArray(Integer[]::new);
		Arrays.sort(b, Collections.reverseOrder());
		
		for(int i=0; i<A.length; i++) {
			answer += A[i] * b[i];
		}
		
		return answer;
	}

}

 

 

2️⃣ 두번째 시도

❓ 풀이과정

    👉 배열 A와 배열 B 모두 오름차순으로 정렬한 후 A와 B 배열 인덱스를 거꾸로 진행시키며 곱하여 누적

❗ 결과

   👉 테스트 통과

✔ 소스코드

import java.util.Arrays;

public class Solution { // 최솟값 만들기

	public static void main(String[] args) {
//		int[] A = { 1, 4, 2 };
//		int[] B = { 5, 4, 4 };
		int[] A = {1, 2};
		int[] B = {3, 4};

		System.out.println(solution(A, B));
	}

	private static int solution(int[] A, int[] B) {
		int answer = 0;
		
		Arrays.sort(A);
		Arrays.sort(B);
		
		for(int i=0; i<A.length; i++) {
			answer += A[i] * B[B.length - i - 1];
		}
		
		return answer;
	}

}

 

 

비록 간단한 문제를 틀렸지만, 덕분에 int형 배열은 Collections.reverseOrder()을 이용하여 내림차순으로 정렬할 수 없고 이는 String이나 Object배열만 가능하다는 것을 알게되었다.

 

또한, int 배열을 내림차순으로 정렬하기 위해서는 다음과 같이 Integer형 배열로 변환 후 Collections.reverseOrder()을 이용하여 정렬할 수 있다는 것 또한 알게 되었다.

Integer[] change = Arrays.stream(arr).boxed().toArray(Integer[]::new);
Arrays.sort(change, Collections.reverseOrder());

 

Comments