728x90
백트랙킹을 이용하는 브루트포스 문제이다.
나올 수 있는 최대 감소하는 수가 9876543210이다. 그렇기에 나올 수 있는 최대 감소하는 수들의 개수를 계산해보면 총 1023개가 나온다. 즉 백트랙킹으로 1023번만에 풀 수 있기 때문에 매번 모든 경우의 수를 구하여도 시간초과가 절대 나지 않기 때문에 모든 경우의 수를 구하여 정렬한 다음 list[N]을 출력 혹은, 1023보다 같거나 큰 수가 N으로 입력되면 -1을 출력하면 된다.
Solution
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.util.*
import kotlin.collections.ArrayList
import kotlin.collections.HashMap
import kotlin.math.min
var br = BufferedReader(InputStreamReader(System.`in`))
var bw = BufferedWriter(OutputStreamWriter(System.out))
var N = 0
var list = ArrayList<Long>()
fun solution() {
N = br.readLine().toInt()
if(N == 0)
bw.write("0")
else
{
backTracking(0, 1, 0)
if(list.size - 1 < N)
{
bw.write("-1")
return
}
list.sort()
bw.write(list[N].toString())
}
}
fun backTracking(index : Int, t : Long, result: Long)
{
var result = result
for(i in index..9)
{
result += i * t
list.add(result)
backTracking(i + 1, t * 10, result)
result -= i * t
}
}
fun main() {
solution()
br.close()
bw.close()
}
728x90
'Algorithm > 문제 풀이' 카테고리의 다른 글
[알고리즘] 특정한 최단 경로 (백준 1504번) (0) | 2020.11.11 |
---|---|
[알고리즘] 택시 (백준 1649번) (0) | 2020.11.03 |
[알고리즘] 부분합 (백준 1806번) (0) | 2020.10.29 |
[알고리즘] 내려가기 (백준 2096번) (0) | 2020.10.29 |
[알고리즘] 수 묶기 (백준 1744번) (0) | 2020.10.22 |
댓글