KDT 실무형 스프링 백엔드 엔지니어 양성과정 6기 | Algorithm CODEKATA
제목
🏷 관련 주제 : Array 연산자
문제 설명
함수 solution은 정수 n을 매개변수로 입력받습니다.n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요.
예를들어 n이 118372면 873211을 리턴하면 됩니다.
제한 조건
n은 1이상 8000000000 이하인 자연수입니다.
입출력 예
| n | return |
|---|---|
| 118372 | 873211 |
✔ Solution with Array
class Solution {
public long solution(long n) {
long answer = 0;
int[] cnt = new int[10];
while (n > 0) {
int idx = (int) (n % 10);
cnt[idx]++;
n /= 10;
}
for(int i = 9; i >= 0; i--) {
while (cnt[i]-- > 0) {
answer = answer * 10 + i;
}
}
return answer;
}
}
채점 결과

💥 오늘 만난 문제 & 나의 시도 💦 & 해결 방법 👍
📌 오늘 만난 문제 : 매개변수로 입력 받은 정수 n의 각 자릿수를 큰 것부터 작은 순으로 정렬한 새로운 정수를 반환하시오.
n의 각 자릿수를 세어 길이 10인 정수 배열 cnt 의 인덱스 i에 n에 존재하는 i의 개수를 할당하자.
1. 변수 초기화
long
answer: 결과값을 반환할 변수
int[]cnt:n의 각 자릿수를 세기 위한 정수 배열 (n의 자릿수i의 개수를cnt[i]에 할당)
long answer = 0;
int[] cnt = new int[10];
2. n의 각 자릿수가 i일 때, cnt[i]의 값을 1 증가시키자.
n의 각 자릿수를 구하기 위해 나머지 연산자를 이용n % 10은n의 일의 자리 숫자n을10으로 나누어n의 각 자릿수를 오른쪽으로 이동
반복문을 통해 일의 자리 숫자를 구해cnt의 해당 인덱스의 값을 1 증가시키는 것을n이0이 될 때까지 반복하자.
while (n > 0) {
int idx = (int) (n % 10);
cnt[idx]++;
n /= 10;
}
배열 cnt의 i 인덱스에는 n에 숫자 i가 cnt[i]개 들어있다는 의미이므로
정수n의 숫자를 내림차순으로 정렬하여 반환하기 위해 cnt의 마지막 인덱스의 값부터 탐색하자.
3. answer에 n의 숫자를 내림차순 정렬한 값을 할당하자.
for(int i = 9; i >= 0; i--) {
while (cnt[i]-- > 0) {
answer = answer * 10 + i;
}
}
4. answer에 할당된 값을 반환하자.
return answer;
💬 무엇을 새롭게 알았는지
처음에는 n을 toCharArray()를 사용하여 형 변환 후,
역순 정렬하고 다시 join() 후, 정수로 형변환하여 반환하려고 했으나
런타임 아웃🚫
두번째는 String으로 변환 후, split()을 통해 문자를 잘라 역순 정렬 후,join()하여 정수로 형변환하여 반환하려고 했으나
런타임 아웃🚫
99클럽에서 전에 풀던 문제에서 Counting을 했던 방법이 떠올랐다.
각 자릿수는 0 ~ 9 범위 안이므로 Counting하기도 좋을 것 같아서
그 방법으로 문제를 풀어 오늘의 문제를 해결하였다.
전에 썼던 코드가 있는데 그 코드보다도 훨씬 빠르고 좋은 코드를 쓸 수 있었다.