본문 바로가기
CODING TEST

[java] 문제 017 (백준 1427)

by 정성인(人) 2024. 6. 9.

문제

소트인사이드

 

교재 풀이

import java.util.Scanner;
public class P1427_내림차순정렬 {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String str = sc.next();
    int[] A = new int[str.length()];
    for (int i = 0; i < str.length(); i++) {
      A[i] = Integer.parseInt(str.substring(i, i + 1));
    }
    for (int i = 0; i < str.length(); i++) {
      int Max = i;
      for (int j = i + 1; j < str.length(); j++) {
        if (A[j] > A[Max])  //내림차순이므로 최대 값을 찾음
          Max = j;
      }
      if (A[i] < A[Max]) {
        int temp = A[i];
        A[i] = A[Max];
        A[Max] = temp;
      }
    }
    for (int i = 0; i < str.length(); i++) {
      System.out.print(A[i]);
    }
  }
}

 

내 풀이

import java.util.*;
import java.io.*;

public class Main
{
	public static void main(String[] args) throws IOException {
// 		내림차순으로 정렬
// 		첫째 줄에 정렬하려고 하는 수 N => 1,000,000,000보다 작거나 같은 자연수
// 		입력
// 		    2143
// 	    출력
// 	        4321
        
//         접근법
//             소트는 그냥 내장 함수 쓰면 되고 
//             입력하는 것만 신경쓰면 되는데 
//             2143을 어떻게 낱개로 쪼갤까?
//                 이를 str으로 받고, substring() 함수를 써서 해도 됨
//                 아님 앞에서 배운 str으로 받고 toCharArray로 한 다음 
//                 -'0'을 해주면 되기도 하고 
//         슈도코드
//             스캐너로 n 입력하고 
//             이를 toCharArray로 해줘서 문자 배열로 만들고
//             for 돌면서 -'0' 해주고 다시 숫자 배열에 담은 다음 
//             array.sort 쓰자 
        Scanner sc=new Scanner(System.in);
        char[] chars=sc.nextLine().toCharArray();
        int n=chars.length;
        
        Integer[] nums=new Integer[n];
        for(int i=0;i<n;i++){
            nums[i]=chars[i]-'0';
        }
        
        Arrays.sort(nums, Comparator.reverseOrder());
        for(int i=0;i<n;i++){
            System.out.print(nums[i]);
        }
	}
}

 

설명

str.length()고 array.length인데 헷갈림 
 

Arrays.sort()를 이용해서 배열을 내림차순으로 정렬하려면, 기본적으로 제공되는 오름차순 정렬을 활용한 후, 배열을 뒤집거나 Comparator를 사용해야 합니다. 다음은 이를 구현하는 두 가지 방법입니다.

방법 1: 배열을 오름차순으로 정렬한 후 뒤집기

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

public class Main {
    public static void main(String[] args) {
        Integer[] arr = {3, 5, 1, 4, 2};
        
        // 오름차순으로 정렬
        Arrays.sort(arr);
        
        // 배열 뒤집기
        Collections.reverse(Arrays.asList(arr));
        
        // 결과 출력
        System.out.println(Arrays.toString(arr));
    }
}

이 방법은 간단히 오름차순으로 정렬한 후 Collections.reverse() 메서드를 사용하여 배열을 뒤집습니다. Arrays.asList()를 사용하여 배열을 리스트로 변환한 후, Collections.reverse()를 적용합니다.

 

방법 2: Comparator를 사용하여 내림차순 정렬

import java.util.Arrays;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) {
        Integer[] arr = {3, 5, 1, 4, 2};
        
        // Comparator를 사용하여 내림차순 정렬
        Arrays.sort(arr, Comparator.reverseOrder());
        
        // 결과 출력
        System.out.println(Arrays.toString(arr));
    }
}

이 방법은 Comparator.reverseOrder()를 사용하여 내림차순 정렬을 직접 수행합니다. Arrays.sort() 메서드는 Comparator를 인수로 받아 이를 기준으로 정렬을 수행합니다.

 

참고: 기본 타입 배열의 내림차순 정렬

위의 방법들은 Integer 배열에 대해서 작동합니다. 기본 타입 배열(int[])에 대해서는 Comparator를 사용할 수 없으므로, 이를 위해 래퍼 클래스인 Integer 배열로 변환하거나 별도로 정렬 후 뒤집는 방법을 사용해야 합니다.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] arr = {3, 5, 1, 4, 2};
        
        // 오름차순으로 정렬
        Arrays.sort(arr);
        
        // 배열 뒤집기
        for (int i = 0; i < arr.length / 2; i++) {
            int temp = arr[i];
            arr[i] = arr[arr.length - 1 - i];
            arr[arr.length - 1 - i] = temp;
        }
        
        // 결과 출력
        System.out.println(Arrays.toString(arr));
    }
}

이 방법은 기본 타입 배열을 오름차순으로 정렬한 후, 직접 배열을 뒤집는 과정을 포함합니다.

요약

  • Arrays.sort(arr)와 Collections.reverse()를 사용하여 배열을 오름차순 정렬한 후 뒤집을 수 있습니다.
  • Arrays.sort(arr, Comparator.reverseOrder())를 사용하여 직접 내림차순으로 정렬할 수 있습니다.
  • 기본 타입 배열의 경우, Integer 배열로 변환하거나, 정렬 후 직접 배열을 뒤집는 방법을 사용할 수 있습니다.