Closed antop-dev closed 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)
}
}
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)
}
}
https://leetcode.com/problems/minimum-domino-rotations-for-equal-row/