[Java] 자바 알고리즘, 프로그래머스 알고리즘 문제풀이 "정수 내림차순으로 배치하기"

정수 내림차순으로 배치하기


문제 설명

함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.


제한 조건

n은 1이상 8000000000 이하인 자연수입니다.


입출력 예

n         return

118372 873211


나의 풀이


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.*;
class Solution {
  public long solution(long n) {
      long answer = 0;
        String strResult="";
        String strn = String.valueOf(n);
        List<String> slist = Arrays.asList(strn.split(""));
        List<Integer> ilist = new ArrayList<Integer>();
        for(String s : slist) {
            ilist.add(Integer.parseInt(s));
        }
        ilist.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        for(Integer i : ilist) {
            strResult+=String.valueOf(i);
        }
        answer = Long.parseLong(strResult);
        return answer;
  }
}
cs


- 자연수 n을 String으로 변환하고 각 자리수를 잘라서 List에 담았습니다.

- 담은 값들을 for문 돌면서 int형으로 형변환하면서 integer형 List에 담습니다.

- 내림차순 정렬은 Collection.sort()와 Arrays.sort() 모두 제공하지 않기 때문에 저는 List인터페이스의 sort() 메소드에 Comparator 익명객체(compare메소드 오버라이딩)을 대입해서 내림차순으로 정의하였습니다.  -> 이에 대해서 더 자세히 알고싶으시면 https://sas-study.tistory.com/105  여기를 참고해주세요!!

- 그렇게 정렬한 integer형 list를 String 변수에다가 String형으로 변환하고 붙여넣습니다.

- Long 클래스에서 제공하는 parseLong() 메소드를 이용해서 문자열을 Long 타입으로 parse하고 반환해주었습니다.!


다른사람의 풀이


1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ReverseInt {
    String res = "";
    public int reverseInt(int n){
        res = "";
        Integer.toString(n).chars().sorted().forEach(c -> res = Character.valueOf((char)c) + res);
        return Integer.parseInt(res);
    }
 
    // 아래는 테스트로 출력해 보기 위한 코드입니다.
    public static void  main(String[] args){
        ReverseInt ri = new ReverseInt();
        System.out.println(ri.reverseInt(118372));
    }
}
cs


- 람다식과 스트림을 이용하면 코드량이 확 줄어들 수 있다는 것을 보여주는 코드입니다... 

로직을 쪼개보자면..

1. 자연수를 Integer.toString() 메소드를 이용해서 String으로 변환.

2. chars() 메소드로 char배열로 쪼개고 이를 sorted() 메소드로 오름차순 변환!

3. 그리고 각 요소를 c라는 변수로 forEach(람다식) 형태로 접근. 

4. 오름차순된 값을 12345라면 1부터 차근차근 오른쪽으로 붙여넣으면 54321 이런식으로 오름차순 정렬 효과를 나타냄.

5. 반환



댓글

Designed by JB FACTORY