문제 설명
함수 solution은 정수 n
을 매개변수로 입력받습니다. n
의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n
이 118372면 873211을 리턴하면 됩니다.
제한 조건
n
은 1이상 8000000000 이하인 자연수입니다.
입출력 예
n | return |
---|---|
118372 | 873211 |
문제는 매우 간단했다. 정수의 각 자릿수를 큰 것부터 작은 순으로 정렬하기만 하면 된다.
우선 접근법은 정수 n
을 String
으로 변환한 다음, char
배열로 변환을 하는 방식으로 생각했다.
그리고 이 배열 내에서 정렬을 한 다음, 다시 Long
타입으로 변경해주려고 한다.
import java.util.Arrays;
class Solution {
public long solution(long n) {
long answer = 0;
// nString : n을 String으로 변환
String nString = Long.toString(n);
// nString을 arr로 변환
char[] arr = nString.toCharArray();
// temp
char[] temp = new char[arr.length];
Arrays.fill(temp, '0');
// nString을 오름차순으로 정렬
Arrays.sort(arr);
// nString을 내림차순으로 정렬
for (int i = 0; i < arr.length; i++) {
temp[i] = arr[arr.length - 1 - i];
}
answer = Long.parseLong(new String(temp));
System.out.println(answer);
return answer;
}
}
그런 다음, 다른 사람이 한 풀이를 한 번 살펴보았다.
import java.util.*;
class Solution {
public long solution(long n) {
String[] list = String.valueOf(n).split(""); // 1단계
Arrays.sort(list); // 2단계
StringBuilder sb = new StringBuilder(); // 3단계
for (String aList : list) sb.append(aList);
return Long.parseLong(sb.reverse().toString()); // 4단계
}
}
String.valueOf(n).split("")
- 순자를 분자열로 변환 후 자릿수 분리
- 결론적으로 숫자를 문자열 배열로 만들어준다.
Arrays.sort(list)
- 문자열 배열을 오름차순으로 정렬한다.
StringBuilder와 sb.append()
- StringBuilder
는 문자열을 효율적으로 결합할 수 있는 클래스이다.
- for-each
문을 사용해서 정렬된 배열의 각 요소를 문자열로 추가한다.
sb.reverse(), Long.parseLong()
- sb.reverse()
:
- StringBuilder
의 문자열을 뒤집는다.
- 예: "112378" → "873211".
- Long.parseLong()
:
- 뒤집힌 문자열을 long
타입 숫자로 변환한다.
- 예: "873211" → 873211.
결과적으로 내가 한 방법과 비슷한 방법이었다.
하지만 코드가 비교적 더 깔끔하고 시각적으로 복잡한 로직이 많이 없었다.
알고리즘을 풀어나가면서 코드 최적화도 하는 방법으로 생각해봐야겠다고 느꼈다.
'problem solving' 카테고리의 다른 글
[프로그래머스] 문자열 내 p와 y의 개수 (0) | 2024.11.29 |
---|---|
[프로그래머스] 대문자와 소문자 (0) | 2024.11.28 |
[프로그래머스] 두 수의 연산값 비교하기 (0) | 2024.11.27 |
[프로그래머스] 가위 바위 보 (0) | 2024.11.26 |
[프로그래머스] 배열 비교하기 (0) | 2024.11.26 |