문제의 이해는 간단. 정수를 내림차순해라.
대학교에서 데이터구조 시간에 배운 버블정렬 되겠다.
과목 이름이 데이터구조가 맞던가.. 이미 오래 전 일이 되어버린.. 알고리즘 수업 때도 배웠지
배열을 한 번씩 훑으면서 자리를 바꿔주고 다시 또 처음부터 정렬하는 방식. 이 문제를 보니까 생각났다.
내 코드
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 라이브러리도 한 번 정리해야지.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Java] Lv.1 콜라츠 추측 (1) | 2022.09.22 |
---|---|
[프로그래머스/Java] LV.1 x만큼 간격이 있는 n개의 숫자 (1) | 2022.09.22 |
[프로그래머스/Java] LV.1 하샤드 수 (1) | 2022.09.20 |
[프로그래머스/Java] LV.1 문자열 내 p와 y의 개수 (1) | 2022.09.20 |
[프로그래머스/Java] LV.1 자연수 뒤집어 배열로 만들기 (0) | 2022.09.19 |