본문 바로가기
코딩테스트/프로그래머스

[프로그래머스/Java] LV.1 정수 내림차순으로 배치하기

by ⓞㅖ롱 2022. 9. 21.

문제의 이해는 간단. 정수를 내림차순해라.

 

 

대학교에서 데이터구조 시간에 배운 버블정렬 되겠다.

과목 이름이 데이터구조가 맞던가.. 이미 오래 전 일이 되어버린.. 알고리즘 수업 때도 배웠지

배열을 한 번씩 훑으면서 자리를 바꿔주고 다시 또 처음부터 정렬하는 방식. 이 문제를 보니까 생각났다.

내 코드

class Solution {
    public int move = 0;
    public long solution(long n) {
        long answer = 0;
        // long -> string -> Char[]
        char[] arr = Long.toString(n).toCharArray();
		
        arr = sort(arr);

	// move > 0 일 경우 변화가 있었으므로 다시 정렬
        while(move > 0){
            //repeat
            arr = sort(arr);
        }

	//반복된 문자열 수정을 위해 StringBuilder 사용
        StringBuilder sb = new StringBuilder();

	//문자열로 변환
        for(char c : arr){
            sb.append(c);
        }
        
     	//long 타입으로 변환
        answer = Long.parseLong(sb.toString());

        return answer;
    }

    public char[] sort(char[] arr){
        char temp;
        move = 0;

	//정렬, 마지막 인덱스는 비교할게 없으므로 arr.length-1 까지 반복
        for(int i=0; i<arr.length-1; i++){
            if(arr[i]<arr[i+1]){
                temp = arr[i+1];
                arr[i+1] = arr[i];
                arr[i] = temp;
                move++; //배열의 값 교환시 한번 더 정렬를 위해 증감
            }
        }

        return arr;
    }
}

 

정렬이 완성 되었을 때 멈추는 데만 신경써서 이미 정렬이 끝난 수를 제외하는 것을 놓쳤다. (그랬다면 효율이 올랐을듯)

 

다른사람 코드

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());
  }
}

 

내 코드와 흐름은 비슷하다.

String[] 스트링 배열로 바꿔준 후 Arrays 라이브러리의 sort() 를 통해 정렬!

StringBuilder로 문자열로 다시 바꿔준 후 내림차순을 위해 reverse() 기능을 활용했다.

 

라이브러리 사용으로 내 코드보다 훨씬 간결하게 완성한 것 같다. 정렬을 직접하지 않고 해결했군.

Arrays 라이브러리도 한 번 정리해야지.