20.정수 내림차순(25.1.13.월)

kinkin_a·2025년 1월 13일

내일배움캠프 TIL

목록 보기
40/100

알고리즘 코드카타 20

문제

내가 짠 코드

class Solution {
    public long solution(long n) {
        long answer = 0;
        int s = 0;
        long k = 1;
        long init;

        for (int i = 0; i < n; i++) {
            if (n / k < 1)
                break;
            else {
                k *= 10;
                s++;
            }
        }
        init = k;

        long[] a = new long[s];

        for (int i = 0; i < a.length; i++) {
            k /= 10;
            a[i] = n / k;
            n = n - (k * a[i]);
        }


        long [] b = new long[s];

        long l=0;
        for (int i = 0; i < s; i++) {
            l=0;//비교값을 0으로 초기화
            for (int j = 0; j < s; j++) {
                if (l <= a[j]) {//a배열을 순서대로 비교해서 
                    l = a[j];//가장 큰 a[j]를 l에 넣기.
                }
            }
            for(int j=0;j<a.length;j++){
                if(l==a[j]) {//다시 재비교해서
                    a[j] = 0;//제일 큰 값은 0으로 바꿔 뒤 비교문에서 제외시키고
                    break;//중복 0을 방지하기 위해 바로 빠져나가기

                }
            }
            b[i]=l;//가장 큰 값  b배열에 차례대로 넣기
        }

        for (int i = 0; i < b.length; i++) {
            init /= 10;
            answer += b[i] * init;//배열에 맞춰 높은 자릿수 순서대로 10씩 나눠서 더해 answer long타입에 더하기. 
        }
        return answer;
    }
}

다른 분 코드 1)

public class ReverseInt {
    String res = "";
    public int reverseInt(int n){
        res = "";
        Integer.toString(n).chars().sorted().forEach(c -> res = Character.valueOf((char)c) + res);
        return Integer.parseInt(res);
    }

    // 아래는 테스트로 출력해 보기 위한 코드입니다.
    public static void  main(String[] args){
        ReverseInt ri = new ReverseInt();
        System.out.println(ri.reverseInt(118372));
    }
} 
stream문 사용. 아직 공부 더 필요.

다른 분 코드 2)

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());
  }
}``````
코드해석:long형 n을 문자열로 변환해 오름차순으로 저장. 
stringbuilder를 불러 문자열을 옮긴후,
역방향으로 변환해 long형으로 다시 치환.
  • Arrays.sort(list): 문자열을 순서대로 정렬하는 메소드(기본적으로 오름차순)

    • Arrays.sort(intArr, Collections.reverseOrder()); // 내림차순 정렬
  • stringBuilder: 문자형 String 과 비슷하지만 메모리 효율면에서 차이가 있다.
    주로 코드에서 문자 변수에 수정 등 자주 접근할 일이 있을 때 사용.
    아래 포스팅에 잘 정리되어 있음.
    https://blog.naver.com/youngjeli/223673677741

  • Long.parseLong: 문자열을 long으로 바꿔주는 메소드

  • reverse( ) : 문자열을 거꾸로 나열하는 메소드

느낀 점

자바는 수학이 아니니, 어려운 문제를 보거든 간편한 메소드를 검색하는 것이 더 효율적이고 시간절약하기 좋다고 느낌.

static

조사한대로 간략하게 설명하자면,
프로그램에서 변수가 선언되어 메모리 할당할 때 이 명령어를 쓰면 메모리는 정적변수로 지정되어 변하지 않는다.
그래서 메인에서 이 명령어가 있는 클래스의 새로운 객체를 여러번 생성해도,
같은 주소를 공유하게 되므로 메모리 관리면에서 효율적인 것.
한 예로

a class{
  int static num=0;
  
 
public static void main(String[] args){
  a a1= new a();
  a a2= new a();
  
  a1.num++;
  a2.num++;

이렇게 코드를 작성한다면 각 num은 1이 될거라 생각되지만
실제로는 같은 num을 공유하기 때문에
최종 num=2가 된다.

0개의 댓글