그냥 하는 노트와 메모장

BOJ 1040 정수 본문

Solved problems

BOJ 1040 정수

coloredrabbit 2020. 5. 24. 15:49

* BOJ 1040 정수

[분류 : 비트마스크, 다이나믹 프로그래밍]


  BOJ 3026 V(링크: https://www.acmicpc.net/problem/3026, 풀이 링크: https://coloredrabbit.tistory.com/110)을 먼저 풀 것을 권장합니다.


[풀이]

  1. [사용할 수 있는 숫자의 수는 K] 이것이 시사하는 바는 총 10개의 숫자 중 K개만을 선택하여 계산하겠단 소린데 경우의 수로 따지면 아무리 커봐야밖에 되지 않습니다.

  2. [백트래킹이 안되는 이유] 뭐 당연하겠지만 K개 골라봤자, 수의 길이가 최대 18까지 올라갈 수 있고, 거기서 K^18 경우의 수가 나올 수 있으므로 시간이 모자랍니다.

  3. [자리수 dp] 

  높은 자리에서 낮은 자리로 내려가며 N과 똑같은 자리수에 똑같은 숫자를 놓는 상황을 생각해보자. 가령 N=45523이고 10^2자리까지 똑같이 구성했다고 생각해보자. 그러면 현재 455까지는 똑같고 사용한 숫자의 수는 2가 된다. 이 때 여기, 10의 자리수에서 승부를 본다면 3이상의 수를 골라야한다. 따라서 똑같은 자리수에 똑같은 숫자를 구성해왔음을 나타내는 플래그 변수가 필요하다.

  위와 다르게 승부를 이미 본 상황에서는 어떻게 될까. N보다 큰 수 중 가장 작은 값을 가져와야한다.

[상황1 - 이미 K개를 다 썼다] - 고른 K 숫자에서 가장 작은 숫자로만 채워주면 된다.

[상황2 - K개를 다 쓰지 않았다] - 사용하지 않은 숫자 중에서 가장 작은 숫자부터 사용해나가면 된다.

  4. [자리수가 클 수도 있다]

  가령 주어진 수가 99999이고 K가 2 이상이라면 5자리로 절대로 구성할 수 없습니다. 이 때는 N을 10의 제곱수로 설정하고 진행하면 비교적 쉽게 처리 가능합니다.



'Solved problems' 카테고리의 다른 글

BOJ 1410 패턴의 개수  (0) 2020.05.25
BOJ 1742 레이싱 결과  (0) 2020.05.25
BOJ 1176 섞기  (0) 2020.05.24
BOJ 1797 균형잡힌 줄서기  (0) 2020.05.22
BOJ 3032 승리  (0) 2020.05.21
Comments