본문 바로가기
Algorithm

[Java&알고리즘] 정수 내림차순으로 배치하기 (Level 1)

by GoodDayDeveloper 2023. 2. 28.
반응형

 

프로그래머스의 알고리즘 문제 및 풀이에 대해 차근차근 포스팅하려합니다.

 

저도 초보자이기도하고 알고리즘에 쉽게 다가갈 수 없는 부분들이 많기 때문에

최대한 알기 쉽게 정리해보려하고 알고리즘을 어려워하는 분들에게 도움이 되었으면 합니다.

 

많이 공유되고 토론이 될 수 있는 공간이 되었으면 좋겠습니다.

 

 

 

 

 

 

 

환경

언어 : 자바

단계 : 레벨 1단계 (입문자용)

정답률 : 86%

 

 

 

 

 

 

제목 

 

정수 제곱근 판별

 

 

 
 

 

 

문제 설명 및 코드

 

 

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

 

 

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

 

 

1
2
3
4
5
6
7
class Solution {
    public long solution(long n) {
        long answer = 0;
        
        return answer;
    }
}
cs

 

 

 

 

입출력 예

 

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
26
27
28
29
30
31
class Solution {
    public long solution(long n) {
        long answer = 0;
         
        String strArr = Long.toString(n);
        int[] intArr = new int[strArr.length()];
        
        for(int i=0; i<strArr.length(); i++){
            intArr[i] = strArr.charAt(i) - '0';
        }
        
        for(int i=0; i<intArr.length; i++){
            for(int a=i+1; a<intArr.length; a++){
                if(intArr[i] < intArr[a]){
                    int tmpVal = intArr[i];
                    intArr[i] = intArr[a];
                    intArr[a] = tmpVal;
                }
            }
        }
        
        StringBuilder strBld = new StringBuilder();
        for(int intVal : intArr){
            strBld.append(Integer.toString(intVal));
        }
        
        answer = Long.parseLong(strBld.toString()); 
        
        return answer;
    }
}
cs

 

 

 

우선 Long타입의 임의의 수를 String 변수에 담습니다.

 

int 배열을 선언한 다음

 

반복문을 통해서 int 배열인 intArr에 charAt메서드를 통해 담아줍니다.

 

 

그리고 이중 반복문으로 intArr를 활용해서 선택정렬을 통해 내림차순을 해줍니다.

맨 앞부터 값을 확인해 나가면서 위치를 교체하는 방식입니다.

 

a반복문이 크다면 

i반복문의 값을 임시저장소인 tmpVal에 담고

a값을 i로 저장한 다음

tmpVal에 담았던 i값을 a에 담아주는 방식입니다.

 

그럼 내림차순이 형성되겠죠.

 

그 후에 StringBuilder 를 이용하여 하나하나씩 문자열로 변환하여 문자를 붙여줍니다.

 

그리고 마지막에 Long타입으로 형변환 후 return 하게 되면 완료입니다.

 

 

 

 

 

참고로

 

 

만약 오름차순을 구현하려면 

 

if(intArr[i] > intArr[a]){

 

내림차순의 if(intArr[i] < intArr[a]){ 이 부분을 부등호만 첫번째 반복문의 인덱스로 향하게 하면

오름차순을 구현할 수 있습니다.

 

 

 

 

 

 

 

 

다른사람 풀이

 

 

1
2
3
4
5
6
7
8
9
10
11
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());
    }
}
 
cs

 

 

 

여기서는 함수에 람다식을 더하여 짧게 마무리 한 코드입니다.

풀이를 하자면

 

long의 값을 string으로 변환 후 

자바 7에서의 charAt() 처럼 String 값을 하나하나 꺼내기 위해 chars().mapToObj를 해줍니다.

Comparator.reverseOrder()를 통해서 역순으로 돌린다음

collect과 StringBuilder로 문자열을 붙여준 후,

마지막으로 Long 타입으로 변환해주면 끝입니다.

 

성능은 떨어질 순 있지만 정말 깔끔한 코드네요.

 

 

 

 

 

반응형

댓글