백준에서 풀었던 동일한 문제를 이 포스팅에 정리한 적이 있는데요. 이번에도 같은 방법으로 풀어봤습니다.
다음 라운드에 부여받는 번호는 현재 번호가 홀수라면 1을 더하고 2로 나누어서 구하고 짝수라면 2로 그냥 2로 나누어주면 구할 수 있습니다.
a와 b가 다음 라운드에 진출했을 때 부여되는 번호가 동일하다면 현재 라운드에서 대결을 하는 것이라고 볼 수 있습니다.
따라서 a와 b의 다음 부여받는 번호를 반복문을 통해서 구하다가 a와 b의 번호가 같아질 때의 라운드에서 1을 빼면 a와 b가 대결하는 라운드를 구할 수 있습니다.
func solution(_ n:Int, _ a:Int, _ b:Int) -> Int {
// 현재 라운드에서 승리한다면 부여받는 번호
func next(_ i: Int) -> Int {
if i % 2 == 0 {
return i / 2
} else {
return (i + 1) / 2
}
}
var round = 1
var a = a
var b = b
// 계속 이긴다고 가정하고 다음 번호룰 부여
//👉 a와 b가 번호가 같다 = 같은 라운드에서 대결한다.
while a != b {
a = next(a)
b = next(b)
round += 1
}
return round - 1
}