관리 메뉴

JIE0025

[코딩테스트입문][lv.0] 최대값 만들기(1) - 자바(Java) 본문

알고리즘/프로그래머스

[코딩테스트입문][lv.0] 최대값 만들기(1) - 자바(Java)

Kangjieun11 2022. 11. 23. 10:38
728x90

프로그래머스 > 코딩테스트 연습 > 코딩테스트 입문 > 최대값 만들기(1) 

문제 링크

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

 

 

 

 


 

문제

 

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

 

제한사항
  • 0 ≤ numbers의 원소 ≤ 10,000
  • 2 ≤ numbers의 길이 ≤ 100

 

 

 

 

 

배열을 정렬하는 방법을 기록하기 위해 이 문제를 들고 왔다.

앞으로 꼭 익숙하게 만들어야지!!

 

 

 

✅ 정답코드

import java.util.*;

class Solution {
    public int solution(int[] numbers) {
        
        //01) 오름차순 정렬후 마지막 & 마지막-1 인덱스 접근해 해결
        Arrays.sort(numbers);
        return numbers[numbers.length-1]* numbers[numbers.length-2];

    }
}
import java.util.*;

class Solution {
    public int solution(int[] numbers) {
        
        //02) 역순정렬 후 0 & 1 인덱스 접근해 해결 하고 싶은데 그럴거면 wrapper클래스가 필요하고, 
        //	  이걸 사용해서 굳이 Arrays.sort()할바엔 걍 아래 방식을 사용하겠움.
        Integer[] tmp = Arrays.stream(numbers).boxed().toArray( Integer[]::new );
        Arrays.sort(tmp, Collections.reverseOrder());
        return tmp[0]* tmp[1];

    }
}
import java.util.*;

class Solution {
    public int solution(int[] numbers) {
        
       //03) Stream을 이용한 정렬
        numbers = Arrays.stream(numbers)
        			.boxed()
        			.sorted(Comparator.reverseOrder())
        			.mapToInt(Integer::intValue).toArray();
        
        return numbers[0] * numbers[1];

    }
}
import java.util.*;

class Solution {
    public int solution(int[] numbers) {
        
       //04) Collection인터페이스를 구현하는 친구들로 변환, Collections.sort()사용
        //단 Wrapper 클래스 사용해야함
        ArrayList<Integer> numArr = new ArrayList<>();
        for(int num : numbers){
            numArr.add(num);
        }
        Collections.sort(numArr);
        return numArr.get(numArr.size()-1)* numArr.get(numArr.size()-2);

    }
}

 

 

 

 

 

✅ 문제를 풀기 위해 새롭게 학습한 것

 

⏺ 배열을 정렬하는 방법 

 

◾️  Arrays.sort()

import java.util.Arrays;
Arrays.sort()
String[] str = {"김례화","강지은","전진우","김민수","곽훈정"};
Arrays.sort(str);

Arrays.stream(str).forEach(i-> System.out.println(i));

- Primitive Type 배열의 정렬을 지원 (String도 예외적으로 가능함)

- 기본적으로 오름차순 정렬

- 숫자, 영문배열, 한글배열 모두 정렬 가능  

 

 

✔️ 내림차순 정렬

내림차순을 위해선 Wrapper클래스를 사용해야한다. 

 

( WHY? )

Collections의 도움을 받는데 컬렉션은 인터페이스라서 구현체에서 메서드를 사용할 수 있기 때문에 Primitive type에선 사용할 수 없다. 

 

import java.util.Arrays;
import java.util.Collections;
// Wrapper 클래스를 활용하여 선언
Integer[] numbers = {5,2,8,10,6,9};

Arrays.sort(numbers, Collections.reverseOrder());

 

 

✔️ 배열의 일부분만 정렬

Array.sort(배열변수, 시작Index, 종료Index)

Array.sort(배열변수, 시작Index, 종료Index, Collections.reverseOrder()); 

 

 

◾️  Collections.sort()

컬렉션 타입의 정렬을 지원!

 

import java.util.Collections;
import java.util.ArrayList;

ArrayList<Integer> nums = new ArrayList<Integer>();
nums.add(5); nums.add(2); nums.add(8);
nums.add(10); nums.add(6); nums.add(9);

Collections.sort(nums);
//Collections.sort(nums, Collections.reverseOrder());

 

 

⏺ stream.boxed()

stream 중간처리 메서드 중 boxed()라는 친구가 있다. 

소속된 인터페이스에는 IntStream, LongStream, DoubleStream --에서 모두 제공되는데,

 

boxed()를 통해  int, long, double 요소를 Integer, Long, Double 요소로 박싱해서 Stream을 생성할 수 있다. 

 

즉 boxed()를 사용하면 Stream<Integer>가 생성되는 것.

 

 

⛔️ 주의사항

IntStream과 Stream<Integer>은 다른 스트림이다.


IntStream   :   기본 int 값의 스트림

Stream<Integer>   :   Integer의 스트림

 

성능에 대한 차이점

1) Integer는 참조에 대한 4byte, 개체에 대해 16byte로 총 20byte이고, int는 4byte이다.

2) Stream<Integer>메모리의 5배를 더 사용된다. 

 

 





references