(Swift) Programmers 예상 대진표

SteadySlower·2022년 12월 1일
0

Coding Test

목록 보기
198/298

코딩테스트 연습 - 예상 대진표

문제 풀이 아이디어

백준에서 풀었던 동일한 문제를 이 포스팅에 정리한 적이 있는데요. 이번에도 같은 방법으로 풀어봤습니다.

다음 라운드에 부여받는 번호는 현재 번호가 홀수라면 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
}
profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.

0개의 댓글