Java Coding Test [ 가장 가까운 큰 수 찾기 ]

song yuheon·2023년 12월 6일
0

Java Algorithm

목록 보기
18/18
post-thumbnail

문제


주어진 자연수 n에 대해, n보다 크면서 n과 동일한 숫자로 구성된 가장 작은 수를 찾는 프로그램을 작성합니다. '동일한 숫자로 구성됨'은 각 자릿수에 동일한 숫자가 사용되었음을 의미합니다. 예를 들어, 123과 231은 숫자 구성이 같지만, 123과 215는 다릅니다.

함수는 자연수 n을 입력받아, n보다 크고 n과 숫자 구성이 같은 가장 작은 수를 반환합니다. 이런 수가 없을 경우 -1을 반환합니다.

예시:

  • 입력: n
  • 반환값: n보다 크고, 구성이 같은 가장 작은 수 또는 -1

제한 사항:

  • n의 범위는 1 이상 9,999,999 이하입니다.

나의 풀이


import java.util.*;
class Sol46 {
    static int[] input;
    static int[] check;
    static int[] combi;
    static int num=0,m=0,ch=0,result=-1;
    public void DFS(int L){
        if(ch==0) {
            String temp = "";
            if (L == m) {
                for (int x : combi) temp += x;
                int tempIsBig = Integer.parseInt(temp);
                if (tempIsBig > num) {
                    result=tempIsBig;
                    ch=1;
                }
            } else {
                for (int i = 0; i < combi.length; i++) {
                    if(check[i]!=1) {
                        combi[L] = input[i];
                        check[i] = 1;
                        DFS(L + 1);
                        check[i] = 0;
                    }
                }
            }
        }
    }
    public int solution(int n){
        int L=0,s=0;
        num=n;
        m=0;
        ch=0;
        result=-1;

        input = Arrays.stream(String.valueOf(n).split(""))
                .map(Integer::parseInt)
                .mapToInt(Integer::intValue)
                .sorted()
                .toArray();
        // 9 , 3 ,3
        m= input.length;
        combi=new int[input.length];
        check=new int[input.length];

        DFS(L);
        return result;
    }

    public static void main(String[] args){
        Sol46 T = new Sol46();
        System.out.println(T.solution(123));
        System.out.println(T.solution(321));
        System.out.println(T.solution(20573));
        System.out.println(T.solution(27711));
        System.out.println(T.solution(54312));
    }
}

출력



테스트 결과



DFS가 아닌 다른 풀이


import java.util.Arrays;

public class Sol46 {
    public int solution(int n) {
        char[] numbers = Integer.toString(n).toCharArray();
        int i = numbers.length - 2;

        // 오른쪽에서 왼쪽으로 이동하며 감소하는 순서가 깨지는 지점 찾기
        while (i >= 0 && numbers[i] >= numbers[i + 1]) {
            i--;
        }

        if (i == -1) {
            return -1; // 다음 순열이 없음
        }

        // 오른쪽에서 왼쪽으로 이동하며 i보다 큰 첫 번째 숫자 찾기
        int j = numbers.length - 1;
        while (numbers[j] <= numbers[i]) {
            j--;
        }

        // 숫자 교환
        swap(numbers, i, j);

        // i 이후 숫자들을 오름차순 정렬
        Arrays.sort(numbers, i + 1, numbers.length);

        // 결과를 int로 변환하여 반환
        return Integer.parseInt(new String(numbers));
    }

    private void swap(char[] array, int i, int j) {
        char temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    public static void main(String[] args) {
        Sol46 solution = new Sol46();
        System.out.println(solution.solution(123));
        System.out.println(solution.solution(321));
        System.out.println(solution.solution(20573));
        System.out.println(solution.solution(27711));
        System.out.println(solution.solution(54312));
    }
}

profile
backend_Devloper

0개의 댓글