Published 2024. 1. 22. 19:44

문제

https://www.acmicpc.net/problem/14629

 

14629번: 숫자 조각

곧 7살을 맞이하는 준하는 유치원에서 숫자가 적힌 나무 조각들을 가지고 노는 것을 좋아한다. 숫자 조각은 총 10개이며, 각각의 조각엔 0부터 9까지의 숫자가 한 숫자씩 적혀있다. 준하는 각 숫

www.acmicpc.net

 

 

접근

  • 기본적인 백트레킹(DFS) 문제
  • N이 1,000,000,000,000 까지로 매우 크다. 그런데 생각해보면 0부터 9까지 만들 수 있는 것은 9자리로 한정되고 그마져도 9876543210 을 초과하는 순간 답은 9876543210으로 고정된다.
  • 그 이외에는 0부터 9까지를 사용하도록 DFS를 만들면서 만들어진 수가 $N$과 얼마나 차이가 나는지를 확인하고 갱신해주면 해결된다.

 

 

정답 코드

import java.util.*;
import java.io.*;

public class Main {

    static boolean[] visited;
    static long gap = Long.MAX_VALUE;
    static long ans;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = br.readLine();

        if (Long.parseLong(line) >= 9876543210L){
            System.out.println(9876543210L);
            return;
        }

        visited = new boolean[10];
        ans = -1;

        solve(line, 0, "");

        System.out.println(ans);
    }

    public static void solve(String line, int length, String current){
        if (line.length() == length){
            long N = Long.parseLong(line);
            long result = Long.parseLong(current);

            if (Math.abs(N - result) < gap){
                ans = result;
                gap = Math.abs(N - result);
            }

            return;
        }

        for (int i = 0; i < 10; i++){
            if (!visited[i]){
                visited[i] = true;
                current += String.valueOf(i);

                solve(line, length + 1, current);

                current = current.substring(0, current.length() - 1);
                visited[i] = false;
            }
        }
    }
}

 

복사했습니다!