728x90
https://www.acmicpc.net/problem/10972
10972번: 다음 순열
첫째 줄에 입력으로 주어진 순열의 다음에 오는 순열을 출력한다. 만약, 사전순으로 마지막에 오는 순열인 경우에는 -1을 출력한다.
www.acmicpc.net
문제 풀이
다음 순열에 대한 규칙을 이해하고 있을 때 문제를 접근할 수 있다.
<다음 순열>
1. 주어진 순열(number)을 오른쪽에서 부터 탐색하여 number[i] > number[i - 1] 위치를 찾는다.
2. 1번에서 구한 위치를 기준으로 순열을 나눈다.
3. 왼쪽의 순열에서 가장 마지막 인텍스의 값(a)과 오른쪽 순열에서 오른쪽 부터 탐색하여 (a) 보다 큰 값의 인덱스(b)를 찾는다. 위의 그림에서 4가 해당 된다. (a)와 (b) 를 swap 한다.
4. 오른쪽 순열을 오름 차순으로 정렬한다.
5. 두 순열을 합한다.
코드
import java.io.*
fun main (args: Array<String>) {
val br = BufferedReader(InputStreamReader(System.`in`))
val N = br.readLine().toInt()
val number = br.readLine().split(" ").map { it.toInt() }.toIntArray()
var index = -1
// 주어진 수열을 오른쪽에서 부터 탐색하여 number[i] > number[i - 1] 인 구간을 찾는다.
for (i in (N - 1) downTo 1 step 1) {
if (number[i] > number[i - 1]) {
index = i
break
}
}
if (index == -1) {
println(index)
} else {
// index 를 기준으로 두 개의 순열로 나눈 뒤
// 왼쪽 순열과 오른쪽 순열을 오른쪽 부터 탐색하여 오른쪽 순열의 값이 왼쪽보다 큰 것을 찾는다.
for (i in (N - 1) downTo index step 1) {
if (number[index - 1] < number[i]) {
val temp = number[index - 1]
number[index - 1] = number[i]
number[i] = temp
break
}
}
val sortList = mutableListOf<Int>()
for (i in index until N) {
sortList.add(number[i])
}
sortList.sort()
val result = StringBuilder()
for (i in 0 until index) {
result.append("${number[i]} ")
}
for (i in 0 until (N - index)) {
result.append("${sortList[i]} ")
}
println(result.toString())
}
}
728x90
'알고리즘(w.KOTLIN) > 탐색' 카테고리의 다른 글
[백준][KOTLIN][10971]외판원 순회2 (0) | 2023.02.01 |
---|---|
[백준][KOTLIN][10819] 차이를 최대로 (0) | 2023.02.01 |
[백준][1748][KOTLIN] 수 이어 쓰기1 (0) | 2023.01.19 |
[백준][9095][KOTLIN] 1, 2, 3 더하기 (0) | 2023.01.19 |
[백준][2309][KOTLIN] 일곱 난쟁이 (0) | 2023.01.12 |