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

컴투루·2022년 6월 22일
0

프로그래머스 Lv.1

목록 보기
11/38

연습문제

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


👀 문제

정수 n을 매개변수로 받고 n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주는 함수 solution을 완성해보자.


✔️ 조건

n은 1이상 8000000000 이하인 자연수


👩‍💻 입력 & 🧙 출력

nreturn
118372873211

🙋‍♀️ 풀이

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

class Solution {
    public Long solution(long n) {
        String a = String.valueOf(n); //long -> String
        
        String [] b = a.split(""); // 배열형태로
      
        Arrays.sort(b, Collections.reverseOrder()); //내림차순
        
        Long answer = Long.parseLong(String.join("",b));

        return answer;
    }
}
  1. long형의 n을 String형으로 형변환시켜 a에 대입
  2. a를 split을 이용해서 배열형태로 String[] b에 대입
  3. sort메서드를 이용해서 배열 b의 값을 내림차순으로 정렬
  4. join메서드를 이용해서 배열 b를 String으로 변환하고 Long.parseLong으로 Long으로 형변환하여 answer return

형변환... 가장 기초이지만 매일 찾아보고 헷갈리는 부분이다.

java의 형변환에 대해 다시 한번 짚고 넘어가야겠다. 🤨


💬 다른 풀이

  1. StringBuilder로 String 생성, reverse 이용 뒤집기
import java.util.*;

class Solution {
  public long solution(long n) {
        String[] list = String.valueOf(n).split("");
        Arrays.sort(list);

        StringBuilder sb = new StringBuilder();
        for (String aList : list) sb.append(aList);

        return Long.parseLong(sb.reverse().toString());
  }
}

sort 메서드를 이용해서 내림차순이 아닌 오름차순으로 정렬을 했다.
StringBuilder를 이용해서 Stringdls aList에 값을 append해주었다. StringBuilder의 reverse메서드를 이용해서 문자전체를 뒤집고 형변환을 해서 return 해주는 풀이이다.

StringBuilder를 사용할 생각은 못했는데 sort메서드를 복잡하게 작성하지 않아도 되고 간단하게 reverse메서드를 사용하는것이 더 간단해 보이는 코드이다.

  1. Stream API & 람다식
import java.util.*;

class Solution {
    public long solution(long n) {
        return Long.parseLong(String.valueOf(n).chars().mapToObj(ch -> (char) ch)
                .sorted(Comparator.reverseOrder())
                .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
                .toString());
    }
}

무엇이 더 좋은 코드인지는 알 수 없지만 위의 코드는 그냥 다 뜯어보면서 이해하고 싶었다.

  • String.valueOf(n)
    - 나와 동일하게 n을 String으로 변환해주었다.

  • .chars().mapToObj(ch -> (char) ch)
    - Stream을 이용해서 String의 문자

  • .sorted(Comparator.reverseOrder( )
    - 배열을 정렬하는 방법으로 reverseOreder()를 사용하면 내림차순으로 정렬된다.

  • .collect(StringBuilder::new, StringBuilder :: appendCodePoint, StringBuilder :: append .toString()
    - IntStream을 문자열로 변환

    • StringBuilder :: new : 공급자
    • StringBuilder :: appendCodePoint : 누산기
    • StringBuilder :: append : 결합기

👏 마무리

자바의 Stream API와 람다에 대한 부분이 많이 부족하다는 것을 느꼈다. 자바에서 배열을 정렬하는 방법도 여러가지가 있었는데 이번 문제를 계기로 자바에 대해 더 공부해봐야할 듯 하다.

부족해...

profile
맘 먹으면 못할 게 없지

0개의 댓글