몰?.루();
백준 14891번 코틀린 본문
제가 짠 코드이긴하지만 기어의 날개(?) 부분을 String으로 저장해둬서
시계 방향, 반시계 방향 회전을 String을 한칸씩 오른쪽이나 왼쪽으로 미는 방법으로 rotate() 함수를 구현한 게 참 신의 한 수 였던 것 같습니다. ^-^a;
그리고 3번 톱니를 돌리면 3번만 rotate 하는 게 아니라 2번과 4번 톱니도 검사해서 반대 방향으로 rotate() 할지 말지를 정해야하는데 이걸 dfs 방식으로 구현한 것도 괜찮은 아이디어인 거 같습니다.
덕분에 굉장히 직관적이면서도 길지 않은 코드가 되었네요.
fun main() {
val gearCount = 4
val gears = ArrayList<Gear>(gearCount)
repeat(gearCount) {
gears.add(Gear(readln()))
}
val k = readln().toInt()
repeat(k) {
val (n, d) = readln().split(" ").map { it.toInt() }
val visited = BooleanArray(gearCount)
dfs(gears, n - 1, d, visited)
}
var answer = 0
if (gears[0].topWing() == '1') answer += 1
if (gears[1].topWing() == '1') answer += 2
if (gears[2].topWing() == '1') answer += 4
if (gears[3].topWing() == '1') answer += 8
println(answer)
}
fun dfs(gears: ArrayList<Gear>, n: Int, d: Int, visited: BooleanArray) {
visited[n] = true
// 내 왼쪽 톱니바퀴가 나와 극이 다르면 나와 반대방향으로 돌린다
if (n > 0 && !visited[n - 1] && gears[n - 1].rightWing() != gears[n].leftWing()) {
dfs(gears, n - 1, -d, visited)
}
// 내 오른쪽 톱니바퀴가 나와 극이 다르면 나와 반대방향으로 돌린다
if (n < gears.size - 1 && !visited[n + 1] && gears[n + 1].leftWing() != gears[n].rightWing()) {
dfs(gears, n + 1, -d, visited)
}
// 마지막으로 나 자신을 돌린다
gears[n].rotate(d)
}
class Gear(var wings: String) {
fun rotate(direction: Int) {
when(direction) {
1 -> { // 시계방향 회전 == wings 문자열을 한칸씩 오른쪽으로 이동
val temp = wings.last()
wings = temp + wings.substring(0 until wings.lastIndex)
}
-1 -> { // 반시계방향 회전 == wings 문자열을 한칸씩 왼쪽으로 이동
val temp = wings.first()
wings = wings.substring(1 .. wings.lastIndex) + temp
}
}
}
fun leftWing(): Char = wings[6]
fun rightWing(): Char = wings[2]
fun topWing(): Char = wings[0]
}
Comments