몰?.루();

백준 14891번 코틀린 본문

카테고리 없음

백준 14891번 코틀린

toonraon 2022. 10. 27. 19:07

제가 짠 코드이긴하지만 기어의 날개(?) 부분을 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