728x90
풀이
- 기둥 세개를 시작, 중간, 끝 위치로 설정한다.
- 3개의 탑을 옮길때 1, 2 를 하나의 묶음으로 생각하고 N = 2 와 동일한 이동으로 생각한다.
- 2번 과정을 통해서 아래와 같은 알고리즘 규칙을 도출 한다.
- hanoi(N - 1, start, mid, end) // N - 1 개의 원탑을 끝 기둥을 이용하여 중간 기둥으로 이동
- hanoi(1, start, end, mid) // 1개의 원탑을 끝 기둥으로 이동
- hanoi(N - 1, mid, end, start) // 첫번째에서 이동된 N - 1 원탑을 중간 기둥에서 시작 기둥을 이용하여 끝 기둥으로 이동
import java.io.*
var count = 0
var result = mutableListOf<String>()
fun main(args: Array<String>) {
val br = BufferedReader(InputStreamReader(System.`in`))
val bw = BufferedWriter(OutputStreamWriter(System.out))
val N = br.readLine().toInt()
hanoi(N, 1, 3, 2)
bw.write("${count}\n")
for (res in result) {
bw.write("${res}\n")
}
bw.flush()
bw.close()
br.close()
}
private fun hanoi(N: Int, start: Int, end: Int, mid: Int) {
if (N == 1) {
count++
result.add("$start $end")
} else {
hanoi(N - 1, start, mid, end)
hanoi(1, start, end, mid)
hanoi(N - 1, mid, end, start)
}
}
728x90
'알고리즘' 카테고리의 다른 글
[KOTLIN] 주어진 입력을 역순으로 출력하기 (0) | 2021.11.21 |
---|---|
[KOTLIN][알고리즘] Brute Force(BF, 완전탐색) (0) | 2021.11.21 |
[BOJ][KOTLIN] 1316 그룹 단어 체커 (0) | 2021.11.18 |
[BOJ][KOTLIN] 2941 크로아티아 알파벳 (0) | 2021.11.18 |
[BOJ][KOTLIN] 1152 단어의 개수 (0) | 2021.11.16 |