antop-dev / algorithm

알고리즘 풀이
MIT License
0 stars 0 forks source link

1007. Minimum Domino Rotations For Equal Row #582

Closed antop-dev closed 1 month ago

antop-dev commented 1 month ago

https://leetcode.com/problems/minimum-domino-rotations-for-equal-row/

antop-dev commented 1 month ago

위 또는 아래 줄을 1~6으로 만들기 위해서 아래→위, 위→아래로 옮기는 회수를 계산 후 가장 적은 회수를 답으로 사용한다.

class Solution {
    fun minDominoRotations(tops: IntArray, bottoms: IntArray): Int {
        var ans = Int.MAX_VALUE
        for (num in 1..6) {
            val count = checkRotations(tops, bottoms, num)
            ans = minOf(ans, count)
        }
        if (ans == Int.MAX_VALUE) {
            ans = -1
        }
        return ans
    }

    /**
     * [num]을 한 줄로 만들기 위해서 아래→위, 위→아래 이동 중 적은 회수 구하기
     */
    private fun checkRotations(tops: IntArray, bottoms: IntArray, num: Int): Int {
        var bottomToTop = 0 // 아래 주사위를 위로 바꾸는 회수
        var topToBottom = 0 // 위 주사위를 아래로 바꾸는 회수
        tops.zip(bottoms) { top, bottom ->
            if (num != top && num != bottom) {
                return Int.MAX_VALUE
            }
            if (num != top) {
                bottomToTop++
            }
            if (num != bottom) {
                topToBottom++
            }
        }
        return minOf(bottomToTop, topToBottom)
    }
}
image
antop-dev commented 1 month ago

tops[0]이나 bottoms[0]의 두 숫자로만 해도 된다. 왜냐하면 둘 중에 하나가 안되는 안되는 것이다(?)

class Solution {
    fun minDominoRotations(tops: IntArray, bottoms: IntArray): Int {
        var ans = Int.MAX_VALUE
        ans = minOf(ans, checkRotations(tops, bottoms, tops[0]))
        ans = minOf(ans, checkRotations(tops, bottoms, bottoms[0]))
        if (ans == Int.MAX_VALUE) {
            ans = -1
        }
        return ans
    }

    /**
     * [num]을 한 줄로 만들기 위해서 아래→위, 위→아래 이동 중 적은 회수 구하기
     */
    private fun checkRotations(tops: IntArray, bottoms: IntArray, num: Int): Int {
        var bottomToTop = 0 // 아래 주사위로 위로 바꾸는 회수
        var topToBottom = 0 // 위 주사위를 아래로 바꾸는 회수
        tops.zip(bottoms) { top, bottom ->
            if (num != top && num != bottom) {
                return Int.MAX_VALUE
            }
            if (num != top) {
                bottomToTop++
            }
            if (num != bottom) {
                topToBottom++
            }
        }
        return minOf(bottomToTop, topToBottom)
    }
}