사용자 도구

사이트 도구


ps:problems:boj:24268

2022는 무엇이 특별할까?

ps
링크acmicpc.net/…
출처BOJ
문제 번호24268
문제명2022는 무엇이 특별할까?
레벨실버 2
분류

브루트포스

시간복잡도O(n*n!)
인풋사이즈n<=9
사용한 언어Python
제출기록30864KB / 100ms
최고기록72ms
해결날짜2022/01/15

풀이

  • N을 d진법으로 바꾼 뒤에, 조건을 만족하는 d자리 숫자를 찾는것은 백트래킹을 잘 써서 구하는 것이 효율적이긴 하다.
  • 하지만 쉽게 구현하려면, 그냥 (0, …, d-1) 의 모든 퍼뮤테이션을 N보다 큰 수가 나올때까지 이터레이션 시키는 것으로도 충분하다. d!개의 퍼뮤테이션에 대해서, 크기비교에 O(d)가 걸리므로 O(d*d!) 인데, d⇐9 이므로 충분히 동작한다.
  • N을 d진법으로 바꿨을때 길이가 d보다 작으면 최솟값을, d보다 크면 -1을 출력해야 하는 처리를 빼먹지 말자. 최솟값은 d=5 을 예로 들면 10234(d) 이다.

코드

"""Solution code for "BOJ 24268. 2022는 무엇이 특별할까?".

- Problem link: https://www.acmicpc.net/problem/24268
- Solution link: http://www.teferi.net/ps/problems/boj/24268

Tags: [Brute Force]
"""

import itertools


def main():
    N, d = [int(x) for x in input().split()]

    min_num = int(''.join(str(x) for x in (1, 0, *range(2, d))), d)
    if N < min_num:
        print(min_num)
        return
    max_num = int(''.join(str(x) for x in reversed(range(d))), d)
    if N >= max_num:
        print('-1')
        return

    base_d = []
    while N > 0:
        N, r = divmod(N, d)
        base_d.append(r)
    base_d = tuple(reversed(base_d))

    
    num = next(x for x in itertools.permutations(range(d)) if x > base_d)
    print(int(''.join(str(x) for x in num), d))


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
I O G T P
 
ps/problems/boj/24268.txt · 마지막으로 수정됨: 2022/01/15 14:43 저자 teferi