개발자는 기록이 답이다

[프로그래머스][Java][Lv.2] 최솟값 만들기 본문

알고리즘/프로그래머스

[프로그래머스][Java][Lv.2] 최솟값 만들기

slow-walker 2023. 10. 18. 09:48

 

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

 

프로그래머스

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

programmers.co.kr

 

 

풀이 설명

각 배열의 값을 곱해서 누적한 것 중에 제일 작은 최솟값을 찾아야 하므로, A는 오름차순, B는 내림차순으로 만들어줌

  •  왜냐하면 [1,4,2],[5,4,4] 라는 배열이 있다고 가정했을때, 각 배열의 큰 값끼리 곱한다면 최솟값이 안나옴
  • int[]배열 내림차순할때 stream쓰려고 했으나 시간초과로 실패함, 그래서 Stream안하고 For문으로 내림차순했음
  • 그리고 정렬된 배열들을 곱해서 누적함
import java.util.*;
class Solution {
    public int solution(int []A, int []B) {
        int answer = 0;
        int len = A.length;
        Arrays.sort(A); // 오름차순
        Arrays.sort(B); // 내림차순용 세팅
        for (int i = 0; i < len / 2; i++) {
            int temp = B[i];
            B[i] = B[len - i - 1];
            B[len - i - 1] = temp;
        }

        for (int i = 0; i < len; i++) {
            answer += A[i] * B[i];
        }
        return answer;
    }
}
정확성 테스트
테스트 1 통과 (0.37ms, 72.6MB)
테스트 2 통과 (0.41ms, 76.3MB)
테스트 3 통과 (0.38ms, 72MB)
테스트 4 통과 (0.38ms, 76.3MB)
테스트 5 통과 (0.38ms, 73.6MB)
테스트 6 통과 (0.42ms, 72.4MB)
테스트 7 통과 (0.46ms, 76.4MB)
테스트 8 통과 (0.36ms, 78.4MB)
테스트 9 통과 (0.38ms, 78.6MB)
테스트 10 통과 (0.40ms, 72.4MB)
테스트 11 통과 (0.36ms, 79.4MB)
테스트 12 통과 (0.43ms, 75.1MB)
테스트 13 통과 (0.36ms, 77.7MB)
테스트 14 통과 (0.39ms, 77.4MB)
테스트 15 통과 (0.38ms, 76.5MB)
테스트 16 통과 (0.37ms, 77.9MB)
효율성 테스트
테스트 1 통과 (1.45ms, 52.3MB)
테스트 2 통과 (1.93ms, 52.3MB)
테스트 3 통과 (1.31ms, 52.6MB)
테스트 4 통과 (1.58ms, 52.4MB)

 

 

Stream을 사용했을 경우 결과 (시간초과)

 

import java.util.*;
class Solution {
    public int solution(int []A, int []B){
        int answer = 0;
        int len = A.length;
        Arrays.sort(A);
        Integer[] BInteger = Arrays.stream(B).boxed().toArray(Integer[]::new);
        Arrays.sort(BInteger, Collections.reverseOrder());

        for (int i = 0; i < len; i++) {
            answer += A[i] * BInteger[i];
        }
        return answer;
    }
}
정확성 테스트
테스트 1 통과 (3.13ms, 76.7MB)
테스트 2 통과 (4.54ms, 78.5MB)
테스트 3 통과 (4.18ms, 75.5MB)
테스트 4 통과 (3.72ms, 73.6MB)
테스트 5 통과 (4.05ms, 77.3MB)
테스트 6 통과 (4.52ms, 74.3MB)
테스트 7 통과 (3.98ms, 76.4MB)
테스트 8 통과 (2.63ms, 73.3MB)
테스트 9 통과 (2.88ms, 75.8MB)
테스트 10 통과 (3.46ms, 77.7MB)
테스트 11 통과 (3.69ms, 86.4MB)
테스트 12 통과 (2.59ms, 76MB)
테스트 13 통과 (2.77ms, 78.4MB)
테스트 14 통과 (2.44ms, 64.9MB)
테스트 15 통과 (2.79ms, 67.6MB)
테스트 16 통과 (2.68ms, 73MB)
효율성 테스트
테스트 1 통과 (6.94ms, 52.4MB)
테스트 2 실패 (시간 초과)
테스트 3 통과 (4.65ms, 53.3MB)
테스트 4 실패 (시간 초과)

 

 

Stream 안쓰고 Int[] 내림차순하기

Stream을 사용하려고 했던 이유는, int[]을 내림차순시 사용할때 Collections.reverseOrder()에 Integer[]만 가능하기 때문이다.

Comparator<? super T> T는 제네릭 클래스로 어떠한 객체를 받아오게 되어있다. 하지만 Int는 Primitive 타입이라 허용되지 않는다.

Arrays.stream(B).boxed().toArray(Integer[]::new);

그래서 int타입 배열을 Integer 배열 boxing(Primitive자료형 -> Wrapper 클래스)로 형변환을 해주었다.

하지만 이렇게 Stream을 사용할 경우 성능이 느려지기 때문에 for문을 사용해서 내림 차순 하는 방법을 알아봤다.

Arrays.sort(B); // 내림차순용 세팅
for (int i = 0; i < len / 2; i++) {
    int temp = B[i];
    B[i] = B[len - i - 1];
    B[len - i - 1] = temp;
}

다른 사람 코드 

오름차순을 내림차순으로 변경하지 않고 바로 B[len - 1 - i]을 이용해서 간결하게 풀었다.

import java.util.*;
class Solution {
    public int solution(int []A, int []B) {
        int answer = 0;
        int len = A.length;
        Arrays.sort(A);
        Arrays.sort(B); 
        for (int i = 0; i < len; i++) {
          answer += A[i] * B[len - 1 - i];
        }
        return answer;
    }
}
정확성 테스트
테스트 1 통과 (0.35ms, 67.3MB)
테스트 2 통과 (0.41ms, 75.9MB)
테스트 3 통과 (0.64ms, 85.3MB)
테스트 4 통과 (0.50ms, 70.5MB)
테스트 5 통과 (0.42ms, 74.3MB)
테스트 6 통과 (0.61ms, 71.6MB)
테스트 7 통과 (0.44ms, 73.1MB)
테스트 8 통과 (0.43ms, 70.2MB)
테스트 9 통과 (0.52ms, 66.4MB)
테스트 10 통과 (0.43ms, 78.2MB)
테스트 11 통과 (0.38ms, 70.7MB)
테스트 12 통과 (0.40ms, 76.2MB)
테스트 13 통과 (0.55ms, 71.5MB)
테스트 14 통과 (0.42ms, 84.5MB)
테스트 15 통과 (0.38ms, 73.6MB)
테스트 16 통과 (0.39ms, 71.5MB)
효율성 테스트
테스트 1 통과 (2.50ms, 52.8MB)
테스트 2 통과 (1.97ms, 52.7MB)
테스트 3 통과 (1.87ms, 52.2MB)
테스트 4 통과 (1.82ms, 52.6MB)