[백준] 16943번 숫자 재배치 - Python / 알고리즘 중급 2/3 - 브루트 포스 - 문제

ByungJik_Oh·2025년 7월 18일
0

[Baekjoon Online Judge]

목록 보기
207/244
post-thumbnail



💡 문제

두 정수 A와 B가 있을 때, A에 포함된 숫자의 순서를 섞어서 새로운 수 C를 만들려고 한다. 즉, C는 A의 순열 중 하나가 되어야 한다.

가능한 C 중에서 B보다 작으면서, 가장 큰 값을 구해보자. C는 0으로 시작하면 안 된다.

입력

첫째 줄에 두 정수 A와 B가 주어진다.

출력

B보다 작은 C중에서 가장 큰 값을 출력한다. 그러한 C가 없는 경우에는 -1을 출력한다.

제한

  • 1 ≤ A, B < 109^9

💭 접근

입력으로 주어질 수 있는 A와 B의 최대가 109^9보다 작기 때문에 정수 A의 최대 자리수는 8자리 이므로 백트래킹을 사용한 순열 알고리즘을 사용하여 해결할 수 있다.

따라서 정수 A의 각 자리수를 저장하고 내림차순으로 정렬한 후, 순열을 구성하고 조건에 맞는 순열이 처음 나왔을 때 크기가 최대이므로 이를 출력해주면 된다.


📒 코드

import sys

def dfs(depth, ans):
    if depth == len(a_num):
        if ans[0] != '0' and int(ans) < b:
            print(ans)
            sys.exit()
        return
    
    for i in range(len(a_num)):
        if visited[i] == 0:
            visited[i] = 1
            dfs(depth + 1, ans + a_num[i])
            visited[i] = 0

a, b = map(int, input().split())
a_num = [n for n in str(a)]
a_num.sort(reverse=True)
visited= [0 for _ in range(len(a_num))]

dfs(0, '')

print(-1)

💭 후기

백트래킹을 활용한 간단한 순열 문제였다.


🔗 문제 출처

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


profile
精進 "정성을 기울여 노력하고 매진한다"

0개의 댓글