hoon's bLog

Java 프로그래머스 정수 내림차순으로 배치하기 자바 본문

코딩테스트/프로그래머스

Java 프로그래머스 정수 내림차순으로 배치하기 자바

개발한기발자 2023. 2. 7. 18:23
반응형

문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12933

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[문제 설명]

 

함수 solution은 정수 n을 매개변수로 입력받습니다.

n의 각 자릿수를 큰 것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요.

예를 들어 n이 118372면 873211을 리턴하면 됩니다.

[제한 조건]

  • n은 1이상 8000000000 이하인 자연수입니다.

[입출력 예]

n return
112378 873211

[먼저 생각해 보기]

자연수를 어떻게 조작하여, 형변환 or 수학을 통한 규칙을 이용한 로직으로 풀 것인가?

필자는 자연수를 문자열로 형변환 하는 방식을 선택했다!

 

[나의 풀이]

import java.util.Arrays;

class Solution {

    public long solution(long n) {
    
        char[] ch = String.valueOf(n).toCharArray();
        Arrays.sort(ch);
        
        return Long.parseLong(new StringBuilder(new String(ch)).reverse().toString());
    }
    
}

먼저 입력받은 자연수를 String.valueOf를 통해 자연수를 문자열로 바꾸고,

toCharArray()로 문자배열로 저장! Arrays.sort()로 오름차순으로 정렬!

int의 범위-2,147,483,648 ~ 2,147,483,647

long의 범위-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

문자열 배열을 StringBuilder와 String 객체 선언을 해준 후 역순정렬 하여,

return 타입은 long 반환을 위해 Long.parseLong으로 Parsing!!

 

[다른 사람들의 풀이]

public class ReverseInt {
    public int reverseInt(int n){
        //return할 변수, ten은 10씩 곱할 변수, tmp_num은 전달된 n값 가지는 임시변수, n의 자리수 알아내는 count
        int total_reverse=0, ten=1, tmp_num=n, count=0;
        int i=0;

        //tmp_num이 0이 아닐 때까지 반복
        while(tmp_num!=0) {
            count++;            //count갯수 증가
            tmp_num = tmp_num / 10; //다음 자리수를 알기 위해 10으로 나눈 값을 tmp_num에 저장
        }

        tmp_num = n;                //다시 n값을 tmp_num에 저장
        int arr[] = new int[count]; //count크기만큼의 배열 생성

        //tmp_num이 0이 아닐 때까지 반복
        while(tmp_num!=0) {
            arr[i] = tmp_num % 10;
            tmp_num = tmp_num / 10;//10으로 나눈 나머지 값을 저장했으니 다음 자리수를 알기 위해 10으로 나눈 값을 tmp_num에 저장
            i++;//인덱스 값 증가
        }

        //내림차순 -> 큰수부터 작은수로 내려감
        for(i=0; i<arr.length; i++)
            for(int j=i+1; j<arr.length; j++)
                if(arr[i]<arr[j]) {
                    int tmp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = tmp;
                }

        //맨 마지막 인덱스인 arr.length-1부터가 1의 자리 수이므로
        for(i=arr.length-1; i>=0; i--) {
            total_reverse += arr[i] * ten;//total_reverse에 arr[i]*ten한 값을 계속 더하기
            ten = ten * 10;//1의 자리 수부터 계산하였으므로 점차 올라가니까 10씩 곱해주기
        }

        return total_reverse;
    }

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

클래스를 생성하여 수학적 로직을 이용하여, 메서드를 생성한 풀이다.

이 코드는 가독성은 다소 떨어질 수 있으나,

형변환을 하지 않고도 문제를 풀이한다는 센스를 배울 수 있었다!

[정리]

개인 피셜 난이도 : ★

어찌 보면 쉽다!라고 생각 할 수 있지만, 처음엔 생각보다 머리가 잘 안 돌아간다.

때에 따라서 형변환하는 풀이가, 수학적인 풀이가 효율적일 수 있음을 인지하고,

상황에 맞게 코딩하는 것이 굉장히 중요하다.

 

그리고 요구되는 데이터의 반환값은 되도록이면 맞춰주는 것이 좋다.

문제 예제만 풀기 급급하다 보면, 내가 생각지 못한 케이스에 발목 잡힐 일이 많다.

특히 실무에서도 나는 해결했다고 하지만, 실제로 내가 코딩하면서,

테스트하지 못한 케이스가 정말 많이 나온다...

 

이걸 줄여 나가려면, 계속 다양한 조건과 방법들을 구상하고 코딩하는 수밖에...ㅎㅎㅎ

어쨌든 오늘 미션도 클리어!

 

언제나 새로운 정보 공유와 잘못된 정보

비판/지적/태클은 환영입니다!

 

끝.

 

728x90
반응형