반응형
문제 출처 : https://www.acmicpc.net/problem/16943
문제
두 정수 A와 B가 있을 때, A에 포함된 숫자의 순서를 섞어서 새로운 수 C를 만들려고 한다. 즉, C는 A의 순열 중 하나가 되어야 한다.
가능한 C 중에서 B보다 작으면서, 가장 큰 값을 구해보자. C는 0으로 시작하면 안 된다.
입력
첫째 줄에 두 정수 A와 B가 주어진다.
출력
B보다 작은 C중에서 가장 큰 값을 출력한다. 그러한 C가 없는 경우에는 -1을 출력한다.
제한
- 1 ≤ A, B < 109
알고리즘 분류
풀이
간단한 순열 문제이다.
문제 조건에서 헷갈렸던 부분이 있는데,
A에 포함된 숫자의 순서를 섞어서 새로운 수 C를 만든다는 것은 A의 모든 수를 사용하여 C를 만들어야 함을 의미한다.
즉 A와 C의 길이가 같아야 한다.
따라서 A에 대한 순열을 구하는데 종료 조건은 A의 길이와 순열 C의 길이가 같을 때이고,
순열 C가 b보다 작다면 정답을 갱신한다.
순열은 문자열로 처리하면 시간이 오래 걸리므로 정수형으로 처리해준다.
코드
val br = System.`in`.bufferedReader()
var answer = -1
var result = 0
fun permutation( a: String, b: String, visited: BooleanArray){
if(result.toString().length==a.length){
if(result<b.toInt())
answer = answer.coerceAtLeast(result)
return
}
for(i in a.indices){
if(visited[i]) continue
visited[i] = true
result = result*10 + (a[i]-'0')
permutation(a,b,visited)
visited[i] = false
result /= 10
}
}
fun main() = with(System.out.bufferedWriter()){
val (a,b) = br.readLine().split(' ')
//a의 길이가 b보다 길다면 c는 모두 b보다 크다
if(a.length>b.length){
write("-1")
close()
return
}
permutation(a,b,BooleanArray(a.length))
write("$answer")
close()
}
반응형
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 17070 파이프 옮기기 1 Kotlin (dfs) (0) | 2022.03.02 |
---|---|
백준 19947 투자의 귀재 배주형 Kotlin(완전 탐색) (0) | 2022.02.28 |
백준 15270 친구 팰린드롬 Kotlin (백트래킹) (0) | 2022.02.23 |
백준 1503 세 수 고르기 Kotlin (완전 탐색) (0) | 2022.02.22 |
백준 17484 진우의 달 여행 (Small) Kotlin (완전 탐색) (0) | 2022.02.21 |
댓글