일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Euler path
- GCD
- Algospot
- Euler circuit
- Shortest path
- graph modeling
- graph
- scc
- dynamic programming
- CS Academy
- Sieve_of_Eratosthenes
- Eulerian path
- BFSDFS
- BOJ
- 백준
- Greedy
- bitmask
- Dag
- backtracking
- implementation
- BST
- disjoint-set
- hashing
- mathematics
- POJ
- Cycle detecting
- Segment Tree
- Eulerian circuit
- DynamicProgramming
- flows
- Today
- Total
그냥 하는 노트와 메모장
BOJ 1040 정수 본문
* 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 |