[백준/JAVA] 정렬 - 1427번 소트인사이드

신승현·2022년 9월 14일
0

더 좋은 문제 풀이가 있거나 궁금하신 점이 있다면 편하게 댓글 남겨주세요!


📝 문제


1427번 소트인사이드


🤷‍♂️ 접근 방법


이번 문제는 지난 [백준/JAVA] 정렬 - 25305번 커트라인 에서 배운 Collections.reverseOrder() 를 사용하여 내림차순으로 배열을 정렬하는 문제와 같습니다. 먼저 정수를 입력 받고, 이를 String으로 변환하여 배열의 값으로 한 글자씩 넣어줍니다. 마지막으로 배열을 내림차순으로 정렬하면 문제가 해결 가능합니다.

다른 사이트를 참고해 살펴본 결과, 또 다른 방법으로는 toCharArray() 메소드로 하나의 문자열을 각 자리의 문자(아스키값)으로 변환하여 char[] 배열을 만드는 방법이 있었습니다. 이 방법은 정말 간단하게 문제를 해결할 수 있기에 아래의 문제 풀이에 방법 2로 정리했으니 꼭 참고해 보시는 것이 좋겠습니다.


📌 str.charAt()

str.charAt(int index) 메서드는 String로 저장된 문자열 중 index의 위치에 있는 한 글자를 char 타입으로 반환합니다. 그렇기 때문에 charAt을 통해 반환된 값을 int 형으로 변환하여 계산식에 사용하고자 하면 아래와 같은 문제가 발생합니다.

String str = "12345";

str.charAt(0);	// 1
str.charAt(1);	// 2

(int) str.charAt(0) + (int) str.charAt(1);	// 49 + 50 = 99

str.charAt(0)에서 charAt을 통해 추출한 값은 char 형인 '1' 입니다. 즉, char 형인 '1'을 int로 변환시키면 아스키 코드 값 49이 되고, str.charAt(1)를 통해 char 형인 '2'을 int로 변환시키면 아스키 코드값 50가 되기 때문에 (int) str.charAt(0) + (int) str.charAt(1); 값으로 99가 출력되는 것입니다.

'0'(char) -> 48
'1'(char) -> 49
'2'(char) -> 50
'3'(char) -> 51
'4'(char) -> 52

이를 해결하기 위해서는 charAt(int i) - '0' 을 통해 char형의 문자를 int형으로 변환시켜야 합니다.

48 - '0'(48) = 0
49 - '0'(48) = 1
50 - '0'(48) = 2
51 - '0'(48) = 3
52 - '0'(48) = 4

CharAt(int i) - '0'을 통해 char형의 문자들을 int형으로 변환시킬 수 있습니다.


📌 valueOf()를 통한 객체 형변환

먼저 valueOf를 살펴보기 전에 Primitive Type 과 Wrapper Class에 대해 알아보도록 하겠습니다. Wrapper Class는 Primitive Type을 객체화한 것으로 아래의 표와 같이 표현합니다.

원시 데이터 타입(Primitive type)을 클래스로 나타낸 Wrapper클래스는 모두 valueOf() 메서드를 가지고 있습니다. valueOf()메서드의 경우 입력 받은 값을 valueOf() 메서드를 호출한 클래스의 객체로 반환하는 역할을 합니다. 아래의 예를 통해 살펴보도록 하겠습니다.

	Integer a =Integer.valueOf(9);		// int 타입을 Wrapper클래스의 Integer 객체로 변환
	Double b = Double.valueOf(5);		// int 타입을 Double 객체로 변환
    Float c = Float.valueOf("80");		// String 타입을 Float 객체로 변환
    String d = String.valueOf(100.0)	// dobule 타입을 String 객체로 변환 	

Integer.parseInt() vs Integer.valueOf

Integer.parseInt() vs Integer.valueOf를 비교해보며 더 자세히 알아보겠습니다.
아래의 코드와 같이 int number1, number2에 담긴 값은 같지만 둘의 자료형이 다른 것을 알 수 있습니다. 둘은 무엇이 다를까요?

int number1 = Integer.valueOf("100"); //100
int number2 = Integer.parseInt("100"); //100

Integer.parseInt()의 경우 기본타입을 int 타입(Primitive type)으로 변환합니다.
Integer.valueOf()의 경우 기본타입을 Wrapper클래스인 Integer 객체로 변환합니다.

📌String.toCharArray()

String.toCharArray()를 사용하면 문자열을 한 글자씩 분리하여 char타입의 배열로 생성할 수 있습니다. 단, 문자열의 공백 또한 인덱스에 포함되니 주의가 필요합니다.

    String str = "hello";

    char[] arr = str.toCharArray(); // ['h', 'e', 'l', 'l', 'o']

✍ 풀이


방법 1

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

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();

        String str = Integer.toString(N);

        Integer []arr = new Integer[str.length()];

        for(int i=0; i< arr.length; i++){
            arr[i] = Integer.valueOf(str.charAt(i) - '0');
        }
		
        //내림차순 정렬
        Arrays.sort(arr, Collections.reverseOrder());

        for(int i =0; i< arr.length; i++){
            System.out.print(arr[i]);
        }
    }
}

방법 2

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

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        char[] arr = sc.nextLine().toCharArray();

        Arrays.sort(arr);

        for (int i = arr.length - 1; i >= 0; i--) {
            System.out.print(arr[i]);
        }
    }
}

Reference

profile
I have not failed. I've just found 10,000 ways that won't work. - Thomas A. Edison

0개의 댓글