포스트

최댓값 만들기(1)

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

문제

  • 최댓값을 찾는 문제로 이를 해결하기 위해서는 주어진 배열에서 가장 큰 두 개의 수를 찾아 곱하면 된다.


  • 문제 풀이

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      import java.util.Arrays;
        
      class Solution {
          public int solution(int[] numbers) {
              Arrays.sort(numbers);
              int length = numbers.length;
              return numbers[length - 1] * numbers[length - 2];
          }
      }
    
    • 배열을 정렬한 후에 마지막 두 수를 곱한다. 정렬로 인해 시간 복잡도가 조금 늘어나겠지만, 배열의 크기가 최대 100개이므로 큰 문제는 없을 것 같다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
      class Solution {
          public int solution(int[] numbers) {
              int max1 = 0;
              int max2 = 0;
        
              for (int num : numbers) {
                  if (num > max1) {
                      max2 = max1;
                      max1 = num;
                  } else if (num > max2) {
                      max2 = num;
                  }
              }
        
              return max1 * max2;
          }
      }
    
    • 반복문을 사용하여 최댓값을 찾고, 두 개의 최댓값을 곱해 최종 결과를 반환한다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
      import java.util.Arrays;
      import java.util.Collections;
        
      class Solution {
          public int solution(int[] numbers) {
              Integer[] sorted = Arrays.stream(numbers).boxed().toArray(Integer[]::new); // Primitive Type을 Wrapper클래스로 박싱해주어야 reverseOrder() 사용 가능
              Arrays.sort(sorted, Collections.reverseOrder());
        
              return sorted[0] * sorted[1];
          }
      }
    
    • reverseOrder()를 사용하여 배열을 내림차순으로 정렬하고, 최댓값 두 개를 곱해서 결과를 반환한다.


  • int 배열의 정렬 - 내림차순

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
      import java.util.*;
        
      public class Main {
      	public static void main(String args[]) {
      		int[] arr = {1, 4, 2, 5, 3};
      		Integer[] arr2 = {1, 3, 4, 2, 5}; 
        		
      		Arrays.sort(arr, Collections.reverseOrder()); // error(Primitive Type을 Wrapper클래스로 박싱해주어야 reverseOrder() 사용 가능)
      		Arrays.sort(arr2, Collections.reverseOrder());
      		for(int x : arr2) System.out.print(x + " "); // [5, 4, 3, 2, 1]
      		}
      }
    
    • Collections.reverseOrder() 함수를 사용
      • Collections는 기본적으로 Object를 상속한 클래스에 대해서 사용 가능한 인터페이스이므로, String, Integer, Double 등과 같은 Object 타입에 배열은 sort에 Collections.reverseOrder() 사용이 가능하다.
      • 기본타입인 int, double, char, float 등은 사용이 불가하므로 기본타입(Primitive Type)의 배열을 Object를 상속하는 Integer, String 같은 Wrapper 클래스로 박싱해주어야 역순정렬이 가능하다. - String은 Java 기본 타입이 아니므로 오류 발생하지 않음

        문제

    1
    2
    3
    4
    5
    6
    7
    8
    
      [정리]
      - 배열 정렬은 Arrays.sort()를 이용한다.
      - 기본타입 정렬은 오름차순만 가능하다.
      - 1차원배열에 역순 정렬을 사용하기 위해서는 Collections.reverseOrder()를 사용한다.
      - Collections는 기본타입은 지원하지 않기 때문에, Wrapper로 박싱이 필요하다.
      - 2차원 배열부터는 Comparator (compare 메소드)를 구현 사용한다.
      - Comparator 사용시 Wrapper Class 비교정렬은 각 클래스마다 구현되어있는 compareTo 메소드를 이용한다.
      - 모든 Wrapper Class 에는 compareTo 메소드가 존재하므로, 잘 활용하자.
    
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.