Algorithms/백준

[백준] '소트인사이드' - Java

LEFT 2023. 7. 14. 16:08

<문제 제시>

<문제설명>
배열을 정렬하는 것은 쉽다. 수가 주어지면, 그 수의 각 자리수를 내림차순으로 정렬해보자.

<예시 입출력>


<문제 해결 과정>

문제에서도 말했듯 배열을 정렬하는 것은 Arrays.sort() 메서드 사용이나, 변수사용으로 for문을 통해 정렬하는 방법 등 쉬울 수 있지만, 숫자가 주어지면 그 숫자를 각 토큰으로 판단하여 내림차순 정렬한 값을 반환해야한다.

Answer 1) 

for(int i = 0; i < N.length(); i++) {
    sort[i] = N.charAt(i) - '0';
}

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

String answer = "";
for(int i = 0; i < temp.length; i++) {
    answer += Integer.toString(temp[i]); 
}

주어진 숫자는 문자열로 주어지기 때문에 N.length()로 길이를 판단하고, 그 길이만큼 sort 배열을 선언한다.

sort에 N.charAt(i) - '0'의 값을 넣는다. (아스키코드를 활용)

문자열4123 일 경우 4 1 2 3이 숫자로 저장된다.

또한 입력값으로 매우 큰 수가 입력될 수 있기때문에 정렬을 위해서 Integer형으로 배열을 선언한다.

stream() 으로 배열을 다루고,

boxed() : 원시타입을 클래스타입으로 바꾼다. 

toArray() : Integer[] 배열 형태로 temp에 저장한다.

Integer[] 형의 배열 temp를 내림차순 정렬한다.

answer에 누적하여 문자열로 반환한다.


<전체코드>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String N = br.readLine();
		int[] sort = new int[N.length()];
		
		for(int i = 0; i < N.length(); i++) {
			sort[i] = N.charAt(i) - '0';
		}
		
		Integer[] temp = Arrays.stream(sort).boxed().toArray(Integer[]::new);
		Arrays.sort(temp, Collections.reverseOrder());
		
		String answer = "";
		for(int i = 0; i < temp.length; i++) {
			answer += Integer.toString(temp[i]); 
		}
		System.out.println(answer);
	}
}

charAt() - '0' 부분처럼 아스키코드를 통해 문자열의 특정 문자를 정수형으로 바꿔 저장할 수 있었다.

큰 값의 데이터를 배열 처리하기 위해 Integer[] 형으로 선언한 배열과 stream()클래스를 통해 boxed(), toArray()로 접근하는 부분 등 공부할 것이 많았다.


문제링크)
https://www.acmicpc.net/problem/1427

 

1427번: 소트인사이드

첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net