본문 바로가기
Language/Java

[Programmers | Java | 연습문제 풀이] 정수 내림차순으로 배치하기 - Solution with Array

by ㅇ달빛천사ㅇ 2024. 6. 16.
728x90

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 의 인덱스 in에 존재하는 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 % 10n의 일의 자리 숫자
n10으로 나누어 n의 각 자릿수를 오른쪽으로 이동
반복문을 통해 일의 자리 숫자를 구해 cnt의 해당 인덱스의 값을 1 증가시키는 것을 n0이 될 때까지 반복하자.

while (n > 0) {
    int idx = (int) (n % 10);
    cnt[idx]++;
    n /= 10;
}

배열 cnti 인덱스에는 n에 숫자 icnt[i]개 들어있다는 의미이므로
정수n의 숫자를 내림차순으로 정렬하여 반환하기 위해 cnt의 마지막 인덱스의 값부터 탐색하자.

3. answern의 숫자를 내림차순 정렬한 값을 할당하자.

for(int i = 9; i >= 0; i--) {
    while (cnt[i]-- > 0) {
         answer = answer * 10 + i;
    }
}

4. answer에 할당된 값을 반환하자.

return answer;

💬 무엇을 새롭게 알았는지

처음에는 ntoCharArray()를 사용하여 형 변환 후,
역순 정렬하고 다시 join() 후, 정수로 형변환하여 반환하려고 했으나
런타임 아웃🚫

두번째는 String으로 변환 후, split()을 통해 문자를 잘라 역순 정렬 후,
join()하여 정수로 형변환하여 반환하려고 했으나
런타임 아웃🚫

99클럽에서 전에 풀던 문제에서 Counting을 했던 방법이 떠올랐다.
각 자릿수는 0 ~ 9 범위 안이므로 Counting하기도 좋을 것 같아서
그 방법으로 문제를 풀어 오늘의 문제를 해결하였다.
전에 썼던 코드가 있는데 그 코드보다도 훨씬 빠르고 좋은 코드를 쓸 수 있었다.


📚 References(참고 자료)

728x90


Top